繁体   English   中英

c char数组和指针

[英]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

最高有效索引a5 ,所以你用两个数组边界以外的写作,是的,它仍然需要一个空终止符。 它起作用的事实只是巧合; 在数组边界外写作是未定义的行为。 它可以工作,它可能会崩溃你的电脑,它可以用你的信用卡购买比萨饼,或完全不同的东西。 你不知道它会做什么,所以就是不要这样做。

当我将数组声明为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM