我有一条错误消息:
不能增加int [2]
类型的值
这是因为int
的大小还是什么?
int arr[2]={10,20};
printf("%p \t %p \t",arr,++arr);
答案 0 :(得分:1)
不能够修改其值的唯一原因是,您定义静态 array
,其大小为n
,然后变量名称 被视为常量指针(其值不能更改)。
这个限制是由编译器强加的,因为它认为如果你改变值
arr
那么就没有办法确保程序的准确性,因为基地址已被修改
但如果您真的想玩指针,请检查以下代码:
int main() {
int arr[] = {1,2,3,0};
int *ptr = arr;
while(*ptr != 0) {
printf("%i ",*ptr);
ptr++; // or ++ptr;
}
return 0;
}
输出: 1 2 3
int main() {
int *arr = (int*)malloc(4*sizeof(int));
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 0;
while(*arr != 0) {
printf("%i ",*arr);
arr++;
}
return 0;
}
输出: 1 2 3
我希望我清楚自己。任何疑问都是最受欢迎的。
答案 1 :(得分:0)
请注意,您正在尝试修改数组的地址。
考虑:
printf("%p \t %p \t",arr,++arr);
我想你想在第二个位置(索引1)打印数组元素的地址。
如果arr[1]
可以尝试打印地址:
使用动态分配的数组
#define ARRAY_COUNT 10
int main() {
int *arr = (int*)malloc(ARRAY_COUNT*sizeof(int));
while(*arr != 0) {
printf("%p ",arr);
arr++;
}
return 0;
}
最终代码:
#include <stdio.h>
int main()
{
int arr[2]={10,20};
int *ptr=arr;
printf("%p \t %p \t\n",ptr,ptr+1);
printf("%p \t %p \t\n",arr,arr+1);
printf("%p \t %p \t\n",arr,&arr[1]);
return 0;
}
示例输出:
sh-4.3$ gcc -o main *.c
sh-4.3$ main
0x7fffdf064110 0x7fffdf064114
0x7fffdf064110 0x7fffdf064114
0x7fffdf064110 0x7fffdf064114
<小时/> 另请注意声明:
printf("%p \t %p \t",arr,++arr);
是未指定或特定于实施的行为,因为它可以(并且确实)在不同的计算机上生成不同的结果。简而言之,C
并未严格指定将参数传递给函数的顺序(从左到右或以其他方式)。
下面:
printf("%p \t %p \t",arr,++arr);
案例1:从左到右参数传递导致arr
地址([0]的地址)首先打印然后递增以打印下一个地址(地址) [1])
输出:
0x7fffdf064110 0x7fffdf064114
0x7fffdf064110 0x7fffdf064114
0x7fffdf064110 0x7fffdf064114
案例2:从右到左参数传递导致arr
地址首先递增并打印([1]的地址)然后打印地址(地址)一个[1])
输出:
0x7fffdf064114 0x7fffdf064114
0x7fffdf064114 0x7fffdf064114
0x7fffdf064114 0x7fffdf064114