[英]c char arrays and pointers
#include<stdio.h>
int main(){
char a[6],*p;
a[0]='a';
a[1]='b';
a[2]='c';
a[3]='4';
a[4]='e';
a[5]='p';
a[6]='f';
a[7]='e';
printf("%s\n",a);
printf("printing address of each array element");
p=a;
printf("%u\n",&p[0]);
printf("%u\n",p+1);
printf("%u\n",a+2);
return 0;
}
输出如下......
anusha@anusha-laptop:~/Desktop/prep$ ./a.out
abc4epfe
printing address of each array element3216565606
3216565607
3216565608
当我将数组声明为char a[6]
为什么它允许我在a[7]
处分配一个值? 是否不需要为最后一个元素追加空字符?
另外p = a => p保存char数组a的第一个元素的地址。 我不明白在地址( p[0]
)前放置一个'&'是怎么回事。 &p[0]
表示的第一个元素的地址的地址a
不使任何意义上,至少给我。
为什么打印正确的输出?
您刚刚调用了未定义的行为。 关于超出数组范围的写作的推理没什么意义。 只是不要这样做。
&p[0]
表示的第一个元素的地址的地址a[]
这是不显
不,那是非常明智的。 您的描述完美地描述了正在发生的事情。 &p[0]
与p
相同,与a
相同。 当你写p[0]
你正在取消引用指针。 然后当你写&p[0]
你正在获取该变量的地址,从而返回到你的起点, p
。
最高有效索引a
是5
,所以你用两个数组边界以外的写作,是的,它仍然需要一个空终止符。 它起作用的事实只是巧合; 在数组边界外写作是未定义的行为。 它可以工作,它可能会崩溃你的电脑,它可以用你的信用卡购买比萨饼,或完全不同的东西。 你不知道它会做什么,所以就是不要这样做。
当我将数组声明为char a [6]时,为什么它允许我在[7]处分配一个值?
因为C和C ++不关心,所以没有对数组进行边界检查。
是否不需要为最后一个元素追加空字符?
没有。 例如,当你声明一个数组说char a [7]; 你告诉编译器你只需要7个字节,不能少。 但是如果你试图在数组外部访问它就是你的问题。
我不明白在地址前面标记'&'是如何正确的(用p [0]标记)。 '&p [0]'表示[]的第一个元素的地址不合理的地址?为什么打印正确的输出?
如果你写p[0]
你引用数组p的值,例如int p[2] = {1,2};
然后p[0]
为1如果你写&p[0]
你得到p [0]的地址,它与p + 0
基本相同
当我将数组声明为char [6]时,为什么它允许我在[7]处分配一个值?
因为你告诉它这样做。 你是老板。 如果你告诉它跳下悬崖,它可能会。
是否不需要为最后一个元素追加空字符?
它不是一个字符串,而是一个字符数组。 除非你想把它当作一个字符串,否则它最后不需要零。 通过将它通过%s
说明符传递给printf
,您将其视为一个字符串,因此您需要在末尾附加一个零,否则,您将通过需要字符串的格式说明符传递不是字符串的内容。
另外p = a => p保存char数组a的第一个元素的地址。 我不明白在地址(p [0])前放置一个'&'是怎么回事。 &p [0]表示至少对我而言没有任何意义的第一个元素的地址。
它的工作原理如下:
p
是指向第一个元素的指针。
&p
是指针的地址。
p[0]
是指针指向的数组中的第一个元素。
&p[0]
是指针指向的数组中第一个元素的地址。
为什么打印正确的输出?
纯粹的运气。 最有可能的是,32位(4字节)的实现对6字节数组后的两个字节无能为力。 所以它将它四舍五入到8个字节,以便接下来的事情将在偶数32位边界处开始。 所以你使用了两个字节,实现并没有使用任何东西。
它允许你在a[7]
分配一个值,因为你很幸运。 这是未定义的行为。 见这里: http : //ideone.com/ntjUn
分段故障!
我希望这有助于您理解数组和指针关系:
a[i] == *(a+i) == *(i+a) == i[a]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.