C字符串、字符数组、指针数组、指向数组的指针 彻底研究
数组名代表的地址是 数组第一个元素的地址,而不是 数组的首地址。数组的地址和数组第一个元素的地址虽然在数值上相同,但是在类型上不同,所以不能进行相等比较。记住: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));
}
忽然发现这个问题我还不知道:
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是一个常数(代表一个地址)。
对常数不能再取地址。
但编译器设计者可能考虑有人不是很明白这个,会对ARRAY NAME常数取地址,那就给出还是那个常数。
ss是数组类型,&ss是取数组的地址,返回的当然是数组的头指针;如果ss定义为char *; &ss的结果是指针的地址,所以会不一样。是数据类型的问题。数组也是一中数据类型。函数指针也是一种类型,函数名就是函数的指针(可以这样认为), &函数名,返回的就是函数地址,和函数名的结果一样。分清楚不同的数据类型就会搞明白