char string[] = "my string"; char *p = 0; p = &string[0]; //&数组第一个元素的地址。 printf("string[0]\t%p\n", p); p = string; //数组的地址。 printf("string\t%p\n", p);
可以看到两个输出地址都一样,能否说明数组开始位置的地址 等于 数组第一个元素的地址?
无论是p = &string[0]还是p = string,++p的结果都是读取第二个字符y。这么说来数组指针就有两种赋值方法了,且两种方法可任选?
解决方案
20
&string[0]; //取数组第一个元素的地址。
string; //数据名不是数组的地址,是数组第一个元素的常量地址,与&string[0]等价。
&string; //这个才是数组的地址。
以上三种表达式从地址值上说,是一样的,即地址值是相等的。当把它们直接赋给char* p的时候,p的值都是一样的,因p是char*类型指针也就是元素地址,所以对p的++ –都仅仅是一个字符的地址跨度。
地址是没有类型的,但指针是有类型的。
元素指针跟数组指针是有区别的,即&string[0]和string是第一个元素常量指针,是char*类型,而&string是char (*p)[10]类型的常量数组指针(注意C语言指针一章里肯定会讲这个数组指针的),所以&string[0]+1与&string+1的结果地址值是不同的,可以本人试试。
一般来说,不同类型指针间赋值是需要强制转换的,又原因是数组指针一般情况下在需要的时候都会自动退化为数组元素指针,所以char* p = &string也是可以的而不需要写成char* p = (char*)&string,但实际上相当于char (*temp) [10] = &string; char*p = temp;
string; //数据名不是数组的地址,是数组第一个元素的常量地址,与&string[0]等价。
&string; //这个才是数组的地址。
以上三种表达式从地址值上说,是一样的,即地址值是相等的。当把它们直接赋给char* p的时候,p的值都是一样的,因p是char*类型指针也就是元素地址,所以对p的++ –都仅仅是一个字符的地址跨度。
地址是没有类型的,但指针是有类型的。
元素指针跟数组指针是有区别的,即&string[0]和string是第一个元素常量指针,是char*类型,而&string是char (*p)[10]类型的常量数组指针(注意C语言指针一章里肯定会讲这个数组指针的),所以&string[0]+1与&string+1的结果地址值是不同的,可以本人试试。
一般来说,不同类型指针间赋值是需要强制转换的,又原因是数组指针一般情况下在需要的时候都会自动退化为数组元素指针,所以char* p = &string也是可以的而不需要写成char* p = (char*)&string,但实际上相当于char (*temp) [10] = &string; char*p = temp;