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));
}


char ss[128];

这样定义的数组名字ss是一个常数(代表一个地址)。
对常数不能再取地址。

但编译器设计者可能考虑有人不是很明白这个,会对ARRAY NAME常数取地址,那就给出还是那个常数。

ss是数组类型,&ss是取数组的地址,返回的当然是数组的头指针;如果ss定义为char *; &ss的结果是指针的地址,所以会不一样。是数据类型的问题。数组也是一中数据类型。函数指针也是一种类型,函数名就是函数的指针(可以这样认为), &函数名,返回的就是函数地址,和函数名的结果一样。分清楚不同的数据类型就会搞明白
posted @ 2007-10-25 16:40  中土  阅读(2336)  评论(0编辑  收藏  举报
©2005-2008 Suprasoft Inc., All right reserved.