ポインター関連の面接の質問

配列名の意味:
1. sizeof( 配列名 ) 、ここでの配列名は計算された配列全体を表します。配列全体のサイズです。
2. & 配列名。ここでの配列名は配列全体を表し、配列全体のアドレスが取り出されます。
3. さらに、すべての配列名は最初の要素のアドレスを表します。
典型的な面接の質問をいくつか見てみましょう
1
int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( "%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}

まずここを知る必要があります(&a + 1) - &a とは配列全体のアドレスを取り出すもので、元々 ptr は 1 のアドレスを指しており、それから +1 を与えました。これは、この配列をスキップすることを意味します、つまり

(a+1) ここで、a は最初の要素のアドレスを表し、+1 は 2 番目の要素のアドレスを表すため、* (*() は 2 番目の要素 (2) です。 1+ a

*(ptr-1) は 5 を指すアドレスであり、逆参照すると 5 となるため、この質問の答えは 2, 5 になります。

2

int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int *ptr1 = (int *)(&a + 1);
    int *ptr2 = (int *)((int)a + 1);
    printf( "%x,%x", ptr1[-1], *ptr2);
    return 0;
}
  int * ptr1 = ( int * )( & a + 1 );这里的 &a表示取出整个数组的地址,ptr1指向1的地址,+1跳过整个数组即指向4后面的地址,即
ptr1[-1] は *(ptr1-1) と同等です。これは、4 を指し、それを 4 に逆参照することを意味します。
  int * ptr2 = ( int * ); ここで、 a は最初の要素のアドレスを表し、型を強制的に int に変換してから +1 (つまり 1 のみ) に変換します。 int 型ではバイトがスキップされ、整数はリトルエンディアン メモリに格納されます。つまり、1、2、3、および 4 は本来、0x00000001、0x00000002、0x00000003、0x00000004 の形式でメモリに格納される必要があります。リトルエンディアン形式1+ a )int )((
したがって、ptr を *ptr=02000000 に逆参照し、%x の形式で出力し、先行する 0 を省略すると、結果は 2000000 になるはずです。
この質問の答えは 4,2000000 です。
3
#include <stdio.h>
int main()
{
    int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    int *p;
    p = a[0];
    printf( "%d", p[0]);
 return 0;
}

a は、3 行と 2 列のペアからなる 2 次元配列です。ここでの 2 次元配列の初期化 ( int 3) } ;、それらの間は「{}」ではなく「,」で区切られているため、3 つの要素、つまり 1、3、5 のみを初期化し、残りはすべて 0 です。つまり、この 2 次元配列は5, 4), (2)、(] < /span>, 0 { (=2][3[

 p = a[0];a[0]表示的是&a[0][0], p就指向1的地址,p[0]表示*(p+0)就是*p就是1;

4

int main()
{
    int a[5][5];
    int(*p)[4];
    p = a;
    printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    return 0;
}

図に示すように、a は int(*)[5] 型、p は int(*)[4] 型です。

& p [ 4 ][ 2 ] - & a [ 4 ][ 2 ],就是他们中间有几个元素,如图,结果是-4,分别以%p和%d形式打印,就是

FFFFFFFC和-4

5

int main()
{
    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int *ptr1 = (int *)(&aa + 1);
    int *ptr2 = (int *)(*(aa + 1));
    printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}
  int * ptr1 = ( int * ); &aa は 2 次元配列全体のアドレスを表し、1 を指します。+1 は配列全体をスキップし、10 番目以降のアドレスを指します。* (ptr1-1 ) 10 を指します。位置逆参照は 10 です。1 + aa & )(
int * ptr2 = ( int * + < /span>)); aa は 2 次元配列の最初の要素のアドレスが 1 を指す最初の行のアドレスであることを意味し、+1 は 2 次元配列の最初の要素のアドレスが 1 を指すことを意味します。最初の行をスキップして 2 番目の行を指します。行の最初の要素のアドレスは 6 で、* (ptr2-1) は 5 の位置を指し、逆参照は 5 です。1aa (* )(
したがって、この質問の答えは 10,5 です

おすすめ

転載: blog.csdn.net/weixin_67131528/article/details/134041792