C语言 数组 字符数组 自加问题

2025-06-24 15:04:41
推荐回答(3个)
回答1:

上面说的挺好的, 不过可能好像还有个问题没有说, 我再补充下吧..

int a[10];
a是一个数组的首地址, 他是一个常量指针, 其值是不能改变的, 如果你想通过移动指针来取数组的下一个元素, 可以这样来做:

int* ptr = a;//声明一个int类型的指针指向数组的首地址;

*(++ptr)取到的是a[1], 注意, 如果写成*ptr++, 虽然++的优先级高于*,但是p++具有滞后性, 也就是ptr先进行完操作(*ptr操作), 在使其值加1, 也就是说*ptr++取到的还是a[0]的值...

"字符数组自加和数组自加效果一样吗?"这句没怎么看懂,字符数组也是数组啊, 当然效果一样...当然这里你说的数组自加也许说的是让数组名++, 上面说了, 数组名是不能进行++操作的...

关于第二个问题
字符数组gets(ch[i])这个很难说对错, 要看具体情况, 如果ch[i]的值是一个指向一段内存的首地址, 这样是可以的(当然输入的字符数要小于这段内存的总长度 - 1), 比如:

#define MAX_LEN 20
char* ch[5];

for(int i=0; i<5; i++)
{
ch[i] = (char*)malloc(MAX_LEN * sizeof(char));
gets(ch[i]);
}

但如果ch[i]只是一个字符, 比如:

char ch[10];
gets(ch[1]);

这样估计编译也过不了...

回答2:

a++得到的是a[1]的地址。
另外gets(ch[i])不能这么写啊 函数原型char *gets( char *buffer ); 参数是指针型的,返回值也是指针型的。

回答3:

对于一维数组,数组名代表的是数组的首地址,而且数组名是一个常量地址,也就是说数组名的地址是不可改变的。因此数组名是一个地址,对数组名使用加法运算,会使地址移到下一个位置。就你的例子而言,数组名a指向的是数组中第一个元素的地址,如果使用a+1,则使a指向了数组中第二个元素的地址,要访问地址中的元素,需要使用指针。而对于常量而言,是不能使用a++这样的语句的,也就是说不能使用诸如3++这样的语句。你要把数组的地址加1,需要使用a+1;

举个例子:
int a[]={1,2,3}
cout<<(a+1)[0]<<*(a+1)<