1

当我以不同方式声明和定义指针 k 时,我使用的是 turbo c,它给出了警告“不可移植指针转换”,并且 *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”。

您的回复将不胜感激!!

4

2 回答 2

2

在第一个代码中,声明后:

*k = &a ; //defination

导致未定义的行为,因为k未初始化,指向垃圾位置。

您应该将其更正为k = *a;

而在第二个代码中,您在声明时分配地址。

首先, is 的类型和is&aint(*)[3][5]类型。可以很容易衰减 int的类型aint(*)[5]*aint[5]int*

其次, is 的类型kint**ktype is int)对于表达式*k = &a,您可能会在两个代码中都收到警告。

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

第一代码:

int *k;
int a[3][5] = {..........}; 
k = *a;

检查工作代码@codepade

二码:

int a[3][5] = {.........}, *k = *a;

检查工作代码@codepade

要理解它,请阅读:

返回什么sizeof(&array)如果是 char 指针数组,
“数组名称”是什么意思?

于 2013-10-25T06:04:38.497 回答
0

int *k = &a;是一样的int *k; k = &a;,不是int *k; *k = &a;

于 2013-10-25T06:28:50.033 回答