C Память указателя языка?
int num = 78;
int *p;
int array[SIZE] = {0,1,2,3,4};
char c[SIZE] = {'A', 'B', 'C', 'D', 'E'};
p = array[3];
*p = (int) *c;
p++;
array[4] = num;
p++;
p = c;
p++;
Я пытаюсь выяснить память за этот код выше. Я понимаю, что указатель p изначально указывает на 3-й элемент массива (который равен 3). Я понятия не имею, что следующая строка *p = (int) *c; средства. Может кто-нибудь объяснить, пожалуйста, эту строку кода?
Изменить: После того, как р увеличивается как таковой, кто-нибудь может объяснить, на что он будет указывать?
3 ответа
*p = (int) *c;
*c
означает, что вы берете значение по адресу c
(int)
бросает его в int
*p=
пишет по адресу p
указывает на
Так что, если вы исправите то, что сказал Дроппи, будет числовое значение c[0]
в 3-й части array
так было бы 1,2,65,4,5
Вы должны использовать 'p = &array[3];'. Затем указатель будет указывать на третий элемент массива, то есть "C"
*p = (int) *c;
c[size]
это массив. c
является базовым указателем массива. так *c
это значение в базовом указателе, который является 'A'
, Это заявление поставит 'A'
в третьем элементе массива. Таким образом, массив теперь содержит A, B, A, D, E
p = array[3]; // int * = int
is an error; the types don't match, and the compiler will yell at you for it. Тип p
является int *
и тип array[3]
является int
,
There are two ways to fix this, depending on what you want to do. Если вы хотите установить p
указывать на array[3]
(which is what you want to do in this case), you would write
p = &array[3]; // int * = int *
If you want to write the value of array[3]
to the object that p
points to (which is not what you want to do in this case, since p
isn't pointing anywhere valid yet), you would write
*p = array[3]; // int = int
In this case, we want to set p
указать на array[3]
, so we use the first statement. After doing that, the following are true:
p == &array[3] // int *
*p == array[3] == 2 // int
Now we have the statement
*p = (int) *c;
is saying "take the value of the char
возражать, что c
points to, convert it to an int
value 1, and assign the result to the object that p
points to."
За исключением случаев, когда это операнд sizeof
или одинарный &
operators, or is a string literal being used to initialize an array of char
in a declaration, an expression of type "N-element array of T
"будет преобразован (" распад ") в выражение типа" указатель на T
", а значением выражения будет адрес первого элемента массива.
Выражение c
has type "5-element array of char
". Since it is not the operand of the sizeof
или одинарный &
operators, it is converted to an expression of type char *
, and the value of the expression is the address of the first element in the array, c[0]
, Таким образом:
c == &c[0] // char *
*c == c[0] == 'A' == 65 (ASCII) // char
Taking all that together, that means
*p = (int) *c;
это еще один способ записи
*p = (int) c[0];
which is another way of writing
array[3] = (int) c[0];
which is another way of writing
array[3] = (int) 'A';
which is another way of writing
array[3] = 65;
(int)
is a cast expression; it means that the value following it should be treated as typeint
,