В чем причина существования указателей на массив? - PullRequest
0 голосов
/ 13 мая 2019

следующий код

#include <stdio.h>
char * arr[]={"my","array"};
main()
{
        printf("%p %p\n",arr, &arr);
        char *(*arr_ptr)[2];
        arr_ptr = &arr;
        arr_ptr = arr;
}

компилируется с предупреждением

2.c: В функции «main»: 2.c: 15: 10: предупреждение: назначение из несовместимого типа указателя [включено по умолчанию] arr_ptr = arr;

Однако при запуске скомпилированная программа напечатает два одинаковых числа.

Вывод заключается в том, что существует другой тип, а именно «указатель на массив», который указывает точно на первый элемент массива.

Мой вопрос: в чем причина существования такого типа указателя, разве недостаточно просто иметь arr в качестве указателя на массив?

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Причины указателей на массивы такие же, как и для типов:

  • Это помогает уменьшить количество ошибок. Если переменная объявлена ​​как указатель на массив, и вы пытаетесь присвоить ему другой тип указателя, компилятор может предупредить вас, когда ваш код компилируется, вместо того, чтобы позволить вашей программе делать что-то не то, когда она выполняется. По этой же причине у нас есть указатели на int отдельно от указателей на char. Это даже причина, по которой мы int отделены от char - предоставление типов всем переменным помогает гарантировать, что они используются для того, для чего они предназначены.
  • Это обеспечивает удобство. Если у вас есть массив массивов и вы хотите работать с конкретными строками, у вас может быть указатель A на одну из строк (которая является массивом). Тогда A+1 - следующая строка, а не следующий элемент в строке, а A-2 - две строки назад. Таким образом, указатели на массивы могут использоваться для работы с массивами в качестве объектов, и компилятор будет отслеживать арифметику для вас, поэтому вам не нужно будет использовать A-2*NumberOfColumns, чтобы вычислить, сколько элементов назад находится в двух строках назад.
0 голосов
/ 13 мая 2019

Потому что почему бы и нет. Задание указателя указывает на мышление. Вы можете использовать этот тип указателя (указатель на массив), чтобы упростить вашу работу, а когда вы узнаете элемент 1. массива, вы узнаете все остальное, поэтому указатель будет очень осторожным.полезный вот простой пример

 int i = 0;

  int arr[4] = { 1, 2, 3, 4}; 

  for(;i<4;i++){
    printf("%d \n",arr[i]);
  }

результат будет:

1 2 3 4

, но с использованием простых указателей

  *arr = 5;
  *(arr+1)=6;
  *(arr+2)=7;
  *(arr+3)=8;

вывод будет:

5 6 7 8

Достигнут массив с указателями.

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