C 数组指针(在同一行中声明和定义会给出垃圾值,而在不同的行中则工作得很好)

C 数组指针(在同一行中声明和定义会给出垃圾值,而在不同的行中则工作得很好),c,pointers,C,Pointers,我用的是turboc 当我以不同的方式声明和定义指针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 ; //definatio

我用的是turboc 当我以不同的方式声明和定义指针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();
}
#包括
#包括
void main()
{
int i,j,*k;//声明
INTA[3][5]={
{ 1, 2, 3, 4, 5 },
{6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 }
};*k=&a;//定义
clrsc();
printf(“%d\n”,*k);//垃圾值
printf(“%d\n”,*(k+2));//垃圾值
printf(“%d\n”,*(k+3)+1);//垃圾值
printf(“%d\n”,*(k+5)+1);//垃圾值
printf(“%d\n”,++*k);//垃圾值
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();
}
#包括
#包括
void main()
{
int i,j;
INTA[3][5]={
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 }
},*k=&a;
clrsc();
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=&a
k
类型为
int*
(而
*k
类型为
int
),您可能会在这两个代码中得到警告

分配二维数组中第一个元素的地址;检查以下内容:

第一个代码:

int *k;
int a[3][5] = {..........}; 
k = *a;
检查工作代码@

第二个代码:

int a[3][5] = {.........}, *k = *a;
检查工作代码@

要理解它,请阅读:



int*k=&a
int*k相同;k=&a,而不是
int*k*k=&a

感谢格里耶什,感谢你对我的概念提出的宝贵帮助,即使在我提出k=a之后;代码给出错误“无法将int[3][5]转换为int*”@anki suggestion
k=a
是错误的,我的错误,请使用工作代码链接检查更新的answes。感谢@Grijesh现在我理解了**感谢您的帮助**希望您继续回答问题(其他问题)。@anki是的,我会回答(如果我能够回答的话)…我的建议是,如果你不读LetUs-C,这是一本过时的基于dos的书。@anki从以下链接中选择一本书: