在C中打印数组元素地址时出错
我收到一条错误消息: 无法增加int[2]类型的值 这是因为在C中打印数组元素地址时出错,c,C,我收到一条错误消息: 无法增加int[2]类型的值 这是因为int的大小还是什么 int arr[2]={10,20}; printf("%p \t %p \t",arr,++arr); 请注意,您正在尝试修改数组的地址 考虑: printf("%p \t %p \t",arr,++arr); 我想您应该在第二个位置(索引1)打印数组元素的地址 要打印地址(如果arr[1]),您可以尝试: &a[1] (a+1) 使用指针 使用动态分配的数组 #define ARRAY_COUNT 10
int
的大小还是什么
int arr[2]={10,20};
printf("%p \t %p \t",arr,++arr);
请注意,您正在尝试修改数组的地址 考虑:
printf("%p \t %p \t",arr,++arr);
我想您应该在第二个位置(索引1)打印数组元素的地址
要打印地址(如果arr[1]
),您可以尝试:
- &a[1]
- (a+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
没有严格规定将参数传递给函数的顺序(从左到右或其他)
在这里:
- 情况1:从左到右的参数传递导致首先打印
地址(a[0]的地址),然后递增以打印下一个地址(a[1]的地址) 输出:arr
0x7fffdf064110 0x7fffdf064114 0x7fffdf064110 0x7fffdf064114 0x7fffdf064110 0x7fffdf064114
0x7fffdf064114 0x7fffdf064114 0x7fffdf064114 0x7fffdf064114 0x7fffdf064114 0x7fffdf064114
- 情况2:从右向左参数传递导致
地址首先递增并打印(a[1]的地址),然后打印地址(a[1]的地址) 输出:arr
0x7fffdf064110 0x7fffdf064114 0x7fffdf064110 0x7fffdf064114 0x7fffdf064110 0x7fffdf064114
0x7fffdf064114 0x7fffdf064114 0x7fffdf064114 0x7fffdf064114 0x7fffdf064114 0x7fffdf064114
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
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;
}
我希望我说清楚了。欢迎任何疑问。您不能增加每一个元素,因为
++
操作符使用int
而不是int[2]
。它的原因是您不能递增arraysso是获取arr[1]地址的唯一方法是:printf(“%p”,arr[1]);或者有另一种方式访问地址!使用printf(“%p\t%p\t”、(void*)arr、(void*)和arr[1])代码>这是未定义的行为。读一本关于基础知识的书。