关于指针与数组的关系

设有下列定义和语句
char str[20]="Program",*p;
p=str;
下列叙述正确的是
A *p与str[0]的值相等
B str与p的类型完全相同
C str 数组长度和p所指向的字符串长度相等
D 数组str中存放的内容和指针变量p中存放的内容相等
答案是A
*p不是整个数组的值吗
B为什么不对 都应该是指针类型啊 还有c d 为什么不对

p指向的是数组第一个元素的地址 所以*p就是取p指向的这个地址的值.
B错在str是指向字符串的指针
比如
printf("%s\n",str);会输出整个Program
由此可以说明BCD都是错的

字符串的表现形式

在C程序中,可以用两种方法实现一个字符串。

1. 用字符数组实现。

[例8.11]

void main(void)

{static char string [ ]="I Love China!";

printf("%s\n",string);

}

运行时输出: I Love China!

和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址,(见图8.17)。string[4]代表数组中序号为4的元素(v),实际上string[4]就是*(string+4),string+4是指向字符“v”指针。

2. 用字符指针实现。

可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。

[例8.12]

void main(void)

{char *string="I Love China!";

printf("%s\n",string);

}

在这里没有定义字符数组,但C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串数组。在程序中定义了一个字符指针变量string。并把字符串首地址(即存放字符串的字符数组的首地址)赋给它(见图8.18)。有人认为string是一个字符串变量,以为定义时把"I Love China!"赋给该字符串变量,这是不确切的。定义string的部分:

char *string="I Love China!";

等价于下面两行:

char *string;

string="I Love China!";

可以看到:string被定义为一个指针变量,它指向字符型数据,请注意只能指向一个字符变量或其它字符类型数据,不能同时指向多个字符数据,更不是把"I Love China!"这些字符存放到string中。只是把"I Love China!"的首地址赋给指针变量string(不是把字符串赋给*string)。因此不要认为上述定义行等价于:

char *string;

*string="I Love China!";

在输出时,用

printf("%s\n",string);

%s表示输出一个字符串,给出字符指针变量名string,则系统先输出它所指向的一个字符数据,然后自动使string加1,使之指向下一个字符,然后再输出一个字符,……,如此直到遇到字符串结束标志‘\0’为止。注意,在内存中,字符串的最后被自动加了一个‘\0’(如图8.18所示),因此在输出时能确定字符串的终止位置。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-03-20
*p不是整个数组的值,在这里,*p指的是p当前所指向的变量(也就是p所指的当前内存)的值,因为str在这里是指数组的首元素,p=str相当于p=&str[0];
B不对的原因是:数组名不能进行++和--(就是自加自减)操作,而指针可以,所以两者并不完全相同;
c不对的原因是:p指的是数组首元素,只指向一个字符
d不对的原因是p中存放的是数组首元素的地址,str中的内容是首元素的值。
第2个回答  2009-03-20
A。*p是第一个字符,p是指向str的首地址,所以*p=str[0]
B。str是一个数组变量名,而p是一个地址指针
C.数组长度是20,而p所指字符串长度是21,因为还有一哦'\0'结束符。
D.数组str中存放是数组元素,而指针变量p存放的只是数组str的首地址。
第3个回答  2009-03-20
*p的值是P,p只指向一个char
明显两类型不同。
C错是因为字符数组是有、0的
D错是因为数组中存放的是以、0结尾的字符串
而指针变量内存放的是数组的首地址,当然不同
第4个回答  2009-03-21
指针本身保存的是被指向对象的地址值。字符数组是在栈上分配的常量指针,也就是说char str[20]系统在栈上分配一片大小20个char占用大小的内存,并将这片内存的首地址赋给str,并且str的值是不可以改变的。
而p = str;一句实际上编译器在编译时执行了隐式类型转换,将常量char指针str转换为char指针。在执行这个语句后,p本身的值和str相同,也就是说p和str指向了栈上的同一片内存。
------------------------
所以:
B str与p的类型完全相同 //错,str是常量char指针,p是char指针
C str 数组长度和p所指向的字符串长度相等 //错,数组长度是20,但是字符串长度只有8,包含'\0'
D 数组str中存放的内容和指针变量p中存放的内容相等 //数组str中前八个字节保存的是'P','r','o','g','r','a','m','\0'另外十二个字节可能根据不同情况有不同的值。而p中只是存放一个地址值。
相似回答