2014-12-24 2 views
-2

Когда я меняю код char* на char**, но я не могу понять, почему я не могу назначить real[0] на адрес.Почему я не могу присвоить реальный [0] адрес x

Когда я выделяю 10*sizeof(char) память, это не значит, что я могу использовать real[0] до real[9]?

Я понимаю, что char** real - после использования с как ниже

char** real = malloc(sizeof(char*) * 10); 

Это решает проблему. Он выделяет 10 char*, и из-за этого я могу назначить адрес x и y и по той же причине в случае char* Я не могу назначить адрес, потому что он просто для символов символов?

И наконец, мне интересно, когда я смогу использовать real[0], real[1] и т. Д.?

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

int main(){ 

    char* real = malloc(sizeof(char) * 10); 

    char x = 'a'; 
    char y = 'b'; 

    real[0] = &x; 
    real[1] = &y; 

    printf("%c %c\n",x,y); 
    printf("%x\n",real[0]); 
    printf("%x\n",real[1]); 
    printf("%d\n",sizeof(&x)); 
    printf("%d\n",sizeof(&y)); 

    return 0; 
} 
+1

Вы определили 'real [0]' и 'real [1]' как символы, а не указатели. Вы могли бы сказать «real [0] = x' вместо' real [0] = & x' –

+0

Предполагая, что вы могли бы это сделать, что бы это значило? Что вы хотите, чтобы это означало? – harold

+0

Спасибо! Но я просто хочу быть уверенным, может ли x быть частью массива, который хранит байты? – mech10

ответ

2

real является char* и, следовательно, является real[0]char. Вы можете сделать real[0] = x;. Кроме того, если вы действительно хотите удержать указатель на x, вам необходимо сделать real a char** и соответственно присвоить распределение.

+0

real [0] - символ, который показывает, что я назначаю для указателя правильно? если char * real; char x [5] = "life" real [0] = x означает real [0] = 'l'? – mech10

+0

Вы пытаетесь распечатать адрес 'x'? Если это так, вы можете напрямую выполнить 'printf ("% x \ n ", &x);' Диапазон указателя зависит от размера слова вашего компьютера, но почти наверняка не будет соответствовать 'char'. – Pradhan

2

&x - указатель на символ.

С real является char * (aka указатель на символ), real[0] является символом, а не указателем на символ. (real[0] такие же, как *(real+0), что означает, что указатель будет разыменовываются получить символ.)

Если вы хотите сохранить &x в real, вы должны объявить его как char **, что означает, что это указатель к указателю на символ. Затем, когда вы разыщите его, вы получите указатель на символ, что и есть &x.

Это правда, что вы можете использовать real[0] для real[9], но учтите, что если вы объявляете real, как char ** то real[0] к real[9] все будет указатели на CHAR (или адреса гольца). Это может быть полезно, если вы хотите изменить свои значения во внешней функции.

+0

спасибо! точка. Для моего случая я застрял с символом char *. Потому что я просто хочу читать данные из файла в указатель (буфер) и хочу сравнить первые 4 байта с еще 4 байтами. Когда я читаю из файла byte by byte, я думаю, каждый байт будет привязан к реальному [0], real [1] ... real [3]. Идем с char *. – mech10

Смежные вопросы