Почему Array Pointer и Array дают одинаковый вывод - PullRequest
0 голосов
/ 05 мая 2019

1) Как получить доступ к элементу массива с массивом указателей?

По указателю на массив мы можем получить доступ следующим образом (∗ a) [0], (∗ a) [22],… .. вот так

верно?

но как с массивом указателей?

2) Проверьте эти три кода, один из них использует массив, а один из них использует массив указателей, а третий - двойной указатель, но все выдают одинаковый вывод.Зачем??

#include <stdio.h>
int ptr[12];
int main(void) {
if(*(ptr+5)==*(ptr+3)){
printf("Equal");
}
else{
printf("Not Equal");
}
return 0;
}

#include <stdio.h>
int *ptr[12];
int main(void) {
if(*(ptr+5)==*(ptr+3)){
printf("Equal");
}
else{
printf("Not Equal");
}
return 0;
}

#include <stdio.h>
    int **ptr[12];
    int main(void) {
    if(*(ptr+5)==*(ptr+3)){
    printf("Equal");
    }
    else{
    printf("Not Equal");
    }
    return 0;
    }

Ответы [ 2 ]

1 голос
/ 05 мая 2019
  1. Просто продолжайте увеличивать указатель по мере чтения массива.Проанализируйте код ниже:

      #include <stdio.h>
      int main(void) {
        int *ptr[3];
        int a[] = { 0,1,2};
        int b[] = { 3,4,5 };
        int c[] = { 6,7,8 };
        ptr[0] = a;
        ptr[1] = b;
        ptr[2] = c;
        for (int i = 0;i < 3;i++)
        printf("%d %d %d\n",*ptr[0]++,*ptr[1]++,*ptr[2]++);
        return 0;
     }
    
  2. Ответил в комментариях.
1 голос
/ 05 мая 2019

In *(ptr+5):

  • ptr - имя массива.
  • Когда массив используется в выражении и не является операндом sizeofили унарный & и не является строковым литералом, используемым для инициализации массива, он преобразуется в указатель на его первый элемент.Таким образом, ptr указывает на элемент 0 массива.
  • ptr+5 добавляет пять, что приводит к указателю на элемент 5 массива.
  • * разыменовывает указатель, создаваясодержимое элемента 5 массива.

Поскольку массив определен вне любой функции, он инициализируется нулем.Следовательно, элемент 5 равен нулю, поэтому *(ptr+5) равен нулю.Точно так же *(ptr+3) равен нулю, поэтому сравнение их показывает, что они равны.

Примеры с int ptr[12];, int *ptr[12]; и int **ptr[12]; просто меняют типы элементов в массиве.В каждом случае *(ptr+5) и *(ptr+3) относятся к элементам 5 и 3 массива.В каждом случае значения элементов равны нулю (нулевые указатели для типов указателей).

Если вы хотите увидеть различия между различными элементами массива, присвойте разные значения элементам массива.

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