數組名代表的地址是 數組第一個元素的地址,而不是 數組的首地址。數組的地址和數組第一個元素的地址雖然在數值上相同,但是在類型上不同,所以不能進行相等比較。記住:C 語言中所說的地址是指標類型,除了大小概念外,還有類型上的約束。
忽然發現這個問題我還不知道:
int
main()
{
char ss[20]=""
printf("0x%x\n",ss);
printf("0x%x\n",&ss);
}
列印出來的結果是ss=&ss,而如果換成 char *ss,則不同;將數組ss移到main外定義,並賦初值,結果相同;如果定義函數ss(),列印結果依然相同,誰能解釋一下?
第二個問題:
void fun(char code[],int size)
{
char temcode[6000]="";
memset(temcode,0,6000);
memcpy(temcode,code,size);
//關鍵的這裡
((void (*)(void))temcode )();//調用函數
//請問這裡是上面那樣寫還是((void (*)(void)) &temcode )(); 為什嗎?
}
int main()
{
char code[]="\x12\x34.......";\\這裡的代碼是一段函數的16進位碼,函數類型為void(*)(void)
fun(code,sizeof(code));
}
char ss[128];
這樣定義的數組名字ss是一個常數(代表一個地址)。
對常數不能再取地址。
但編譯器設計者可能考慮有人不是很明白這個,會對ARRAY NAME常數取地址,那就給出還是那個常數。
ss是數群組類型,&ss是取數組的地址,返回的當然是數組的頭指標;如果ss定義為char *; &ss的結果是指標的地址,所以會不一樣。是資料類型的問題。數組也是一中資料類型。函數指標也是一種類型,函數名就是函數的指標(可以這樣認為), &函數名,返回的就是函數地址,和函數名的結果一樣。分清楚不同的資料類型就會搞明白