В чем разница между int * p и int (* p) [] в контексте массивов.? - PullRequest
0 голосов
/ 01 сентября 2018

Использование DevCpp с TDM GCC 4.9.2 в Windows 8. Но я не думаю, что платформа имеет значение для этого вопроса.

Я знаю, что мы можем использовать указатель для указания на отдельные данные или массив данных. Я узнал об указателе на массивы, но никогда не использовал его. Какое преимущество имеет одно над другим?

Пример кода ...

#include <stdio.h>
int main()
{
    int x[2]={10,20};
    int *p1= NULL; //simple pointer
    int (*p2)[] = NULL; //pointer to an array, specifically

    p1 = x;
    p2 = &x; //removing the & gives me a warning of "assignment from incompatible pointer types".

    printf("x[1] = %d\n", x[1]);

    *(p1+1) = 7;

    printf("x[1] = %d\n", x[1]);

    (*p2)[1] = 55;

    printf("x[1] = %d", x[1]);

    return 0;
}

Имеет ли p1 или p2 преимущество перед другими?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Указатель на массив означает указатель, который принимает адрес массива. скажем, массив это int arr [5], в котором размер int равен 4 байта. p - указатель на массив, который принимает адрес массива int.

int arr[5];
int (*p)[5];
p=&arr;//address of an array block

скажем, базовый адрес равен 1000. Так что после увеличения в p это приведет нас к 1020 адресам, потому что размер блока массива составляет 20 байтов. р указывает на 1000 адрес

p++;
//Now p points to 1020 not 1004.

В то время как в случае int * q, q будет указывать на 1004. Как обычно.

0 голосов
/ 01 сентября 2018

Они совершенно разные.

int *p; - указатель на int

int (*p)[1]; - указатель на массив (в данном случае только один элемент)

В вашем тривиальном примере арифметика указателей будет такой же, а сгенерированный код будет таким же. Но они все еще имеют разные типы, и вы можете получать предупреждения при компиляции.

«Преимущества», которые вы увидите, когда ваш пример будет менее тривиальным:

int (*p)[100];

p++; указатель будет указывать на следующие 100 элементов массива int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...