我正在使用 turbo c 当我不同地声明和定义指针 k 时,它会发出警告“不可移植指针转换”,* k 的结果显示为垃圾
#include<stdio.h>
#include<conio.h>
void main()
{
int i,j,*k;//declaration
int a[3][5] = {
{ 1, 2, 3, 4, 5 },
{6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 }
}; *k = &a ; //defination
clrscr();
printf("%d\n",*k);//garbage value
printf("%d\n",*(k+2));//garbage value
printf("%d\n",*(k+3)+1);//garbage value
printf("%d\n",*(k+5)+1);//garbage value
printf("%d\n",++*k);//garbage value
getch();
}
当在同一行中定义和声明指针 k 时,它给出了结果
#include<stdio.h>
#include<conio.h>
void main()
{
int i,j;
int a[3][5] = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 }
}, *k = &a ;
clrscr();
printf("%d\n",*k); //1
printf("%d\n",*(k+2)); //3
printf("%d\n",*(k+3)+1); //5
printf("%d\n",*(k+5)+1); //7
printf("%d\n",++*k); //2
getch();
}
此题取自《letusC》。
非常感谢您的回复!!
最佳答案
在第一个代码中,声明之后:
*k = &a ; //defination
导致未定义的行为,因为 k
未初始化,指向垃圾位置。
您应该将其更正为 k = *a;
而在第二个代码中,您在声明时分配地址。
首先,&a
的类型是int(*)[3][5]
,a
的类型是int (*)[5]
。 *a
的类型是 int[5]
很容易衰减 int int*
其次,k
的类型是int*
(而*k
类型是int
)用于表达*k = &a
您可能会在这两个代码中收到警告。
分配二维数组中第一个元素的地址;检查以下内容:
第一个代码:
int *k;
int a[3][5] = {..........};
k = *a;
检查工作代码@ codepade
第二个代码:
int a[3][5] = {.........}, *k = *a;
检查工作代码@ codepade
要理解它,请阅读:
What does sizeof(&array)
return?和
What does the 'array name' mean in case of array of char pointers?
关于c - 数组指针(在同一行中声明和定义给出垃圾值,而在不同行中工作得很好),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19582187/