Установка указателя на блок стековой памяти?

Я хочу создать указатель на блок стека памяти. Я не хочу копировать содержимое, просто указатель на него. Как мне это сделать?

Это то, что я пытался...

char p[3][2] = { 1,2,3,4,5,6 };
printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1]); //works fine 

char pc[3][2] = { 1,2,3,4,5,6 };
char **p = (char**)pc;//No error here... but shows on next line when accessing through the pointer
printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1]);  //ERROR:  an Exception thrown here... 

4 ответа

Решение

Указатели не являются массивами, а char** не хранит информацию, необходимую для индексации второго измерения любого массива, на который он может указывать.

Так что вместо char** вам нужен указатель на char[2] массив, потому что в противном случае размер второго измерения pc не известно pтакой, что p[n] не может быть определено.

Вы можете решить это, объявив указатель на массив следующим образом:

char pc[3][2] = { 1,2,3,4,5,6 }; 
char (*p)[2] = pc;
printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], 
                                     p[1][0], 
                                     p[2][0], 
                                     p[0][1], 
                                     p[1][1], 
                                     p[2][1] ) ;

Чтобы он давал правильные результаты, размерность p указатель должен точно соответствовать второму измерению двумерного массива pc массив.

Вы должны различаться между указателями и массивами.

char **p имел ввиду это p это указатель на указатель на char, использование char *p вместо.

char *p = &pc;

Это не позволяет использовать нотацию p[x][y]. Для этого мы можем сделать так:

char (*p)[2] = pc;

Это работает, когда я попробовал ваш код. Вот оно полное основное:

int main()
{
    char pc[3][2] = { 1,2,3,4,5,6 };
    char (*p)[2] = pc;
    printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1]);
}

Он компилируется без предупреждений (ну, я не представил никаких предупреждений, которых раньше не было) и выдает это:

$ ./a.out 

LIST:1,3,5,2,4,6

Чтобы удалить предупреждение, измените

char pc[3][2] = { 1,2,3,4,5,6 };

в

char pc[3][2] = { {1,2},{3,4},{5,6} };

Спасибо ММ за улучшения.

Это то, что я сделал:(Я не хочу указывать размер указателя при его определении. При переопределении я буду указывать размер)

//assigning a pointer to a matrix
char pc[3][2] = { 1,2,3,4,5,6 };
char *pp;//this pointer(as a member) will be carried between classes.      
pp = &pc[0][0];//set pointer to the address of the first element:  via:  Igor Tandetnik

//redefining, validation and display
char p[2][3]; 
memcpy(p, pp, sizeof(char) * 6);
printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1]);

Что интересно, для 1d-массива вы устанавливаете указатель на имя массива (адрес), а не адрес в первом элементе.

char pc[6] = { 1,2,3,4,5,6 };
char *pp;
pp = pc;//set pointer to the address of the 'pc', not the first element  

Указатель - это переменная, которая хранит адрес памяти чего-либо. Следовательно, вам нужно назначить адрес памяти pc указателю на pc. Вы получаете адрес памяти чего-либо через оператор адреса &.

Указатель на компьютер

CHAR *ppc = &pc[0];

или просто:

CHAR *ppc = pc;
Другие вопросы по тегам