这道题选项都含糊其词,ZZ一样,只能选出个相对正确的
选A
笔试练习遇到这题,选择A错误,说答案需要选C,就很奇怪了。
个人想法
选项A、指针指向数组,p是指针p指向的地址对应的值,数组首地址为索引0的元素,所以p==str[0];
选项B、完全相同错,虽都是char,但一个是数组,一个是指针。
选项C、str数组的长度是20;p存的仅为数组首地址,
选项D、p存的是一个地址,str存的是字符串
回看这个问题,发现之前的个人想法有些描述不当
,重新表述下
先说几个点:
1、指针类似于一个存放地址变量,指针本身有自己的地址
2、p
是指向变量的地址, *p
是指向变量的值
3、数组的地址是连续的,数组首地址等于首个元素的地址(str == &str[0] 或 *str == str[0]
)
数组首地址与首元素关系
int main()
{
char str[20] = "Program";
char *p;
printf("%p\n", str);
printf("%p\n", &str[0]);
printf("%c\n", *str);
printf("%c\n", str[0]);
return 0;
}
回到上面的选择在题目
四个答案解析:
选项A:*p取指向地址的值,而数组的首地址和str[0]的地址是同一个,是同一地址同一个值
选项B:str是char类型数组,p是char类型指针,一个放字符串,一个放地址,虽说都是char
选项C:数组长度是20,声明时就已经确定;*p指向字符串长度是7,字符串结束符’\0’;
选项D:数组str中存的是个字符串,p存的是指向这个字符串的地址,所以放的内容不一样