Может ли знак разыменования указателя * называться «многие»? - PullRequest
0 голосов
/ 24 сентября 2018

Я видел, что указатель на одну переменную или массив в C объявлен и напечатан с использованием того же синтаксиса.Поэтому я подумал, что * будет называться many, как в знаке регулярного выражения *, что означает многие, такие как x * = xxx ....

int a[3] = { 4, 5, 6 };
int b = 3;

int *p, *q; // same syntax for either single variable or array
p = a; // pointer to many int
q = &b; // pointer to an int
printf("%d %d", *p, *q); // same syntax again

Так что я могу назвать и p, и q какpointer to many int для простоты понимания?

Ответы [ 2 ]

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

Нет, это не очень хорошая идея.Указатель может указывать только на одну переменную, хотя это часто первый элемент массива.p = a; - указатель на первый элемент в массиве a и только на этот.Указатель сам по себе не может знать, есть ли еще действительные данные после адреса, на который он в данный момент указывает.

Например, не имеет смысла писать такую ​​функцию, как void print_array(int* p), поскольку эта функция не будет знать размер массива, поскольку p указывает только на первый элемент.Мы предпочли бы написать что-то вроде void print_array(int* p, int size)


Расширенный раздел (игнорировать, если новичок): указатель на «много int» скорее будет более экзотической функцией, называемой «указатель массива», такой как int (*)[3] = &a;.Вы можете думать об этом как о «указателе на весь массив», а не только на первый элемент.

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

Ну, не совсем, типы не являются взаимозаменяемыми .

При использовании в качестве RHS присвоения (среди многих других случаев) переменная с массивом типов распадается на типуказатель на первый элемент массива. note

Итак,

p = a;

совпадает с

p = &(a[0]);

, где обе стороныимеют указатель типа на целое число (int *).


ПРИМЕЧАНИЕ:

Цитирование C11, глава §6.3.2.1

За исключением случаев, когдаэто операнд оператора sizeof, оператора _Alignof или унарного оператора &, или строковый литерал, используемый для инициализации массива, выражение, которое имеет тип '' массив типа '' преобразуется в выражение с типом ' 'указателем на тип' ', которое указывает на начальный элемент объекта массива и не является lvalue.[...]

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