1

ポインター k を異なる方法で宣言および定義するときにターボ c を使用しています

#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;

一方、2 番目のコードでは、宣言時にアドレスを割り当てます。

まず、 is の型と&aisのint(*)[3][5]aですint(*)[5]*aisの型はint[5]簡単に int に減衰しますint*

第 2 に、 is の型k(int*および*ktype is int) の式について*k = &aは、両方のコードで警告が表示される場合があります。

2 次元配列の最初の要素のアドレスを割り当てます。以下を確認してください:

最初のコード:

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 に答える