Проблема с объявлением массива указателей - PullRequest
3 голосов
/ 06 апреля 2011

Когда я выполняю этот код

#include<stdio.h>

int main() {
 int (*x)[5];
printf("\nx = %u\nx+1 = %u\n&x = %u\n&x + 1 = %u",x,x+1,&x,&x+1);
}

Это вывод на C или C ++:

x = 134513520
x+1 = 134513540
&x = 3221191940
&x + 1 = 3221191944

Пожалуйста, объясните.Кроме того, в чем разница между

1008 *int x[5] и int (*x)[5]?

Ответы [ 4 ]

7 голосов
/ 06 апреля 2011
  • int x[5] - это массив из 5 целых чисел
  • int (*x)[5] - это указатель на массив из 5 целых чисел

Когда выувеличивая указатель, вы увеличиваете размер указанного типа.Следовательно, x+1 на 5*sizeof(int) байт больше, чем просто x, что дает шестнадцатеричные значения 8048370 и 8048384 с разницей 0x14 или 20.

&x - указатель науказатель - таким образом, когда вы увеличиваете его, вы добавляете sizeof(a pointer) байт - это дает шестнадцатеричные значения bf9b08b4 и bf9b08b8, с разницей 4.

5 голосов
/ 06 апреля 2011
  1. int x[5] - это массив из 5-ти дюймов
  2. int (*x)[5] - указатель на массив из 5-ти значений
  3. int* x[5] - массив из 5 указателей на целые числа
4 голосов
/ 06 апреля 2011
int (*x)[5];

объявляет указатель на массив.

Из названия вопроса вы, вероятно, захотите

int* x[5];

вместо этого, который объявляет массив указателей.

int x[5];

объявляет простой старый массив int с.

3 голосов
/ 06 апреля 2011
int x[5];

объявляет массив из пяти целых чисел.

int (*x)[5];

объявляет указатель на массив из пяти целых чисел.

Вы можете найти cdecl.org полезно.

...