Установка указателя на блок стековой памяти?
Я хочу создать указатель на блок стека памяти. Я не хочу копировать содержимое, просто указатель на него. Как мне это сделать?
Это то, что я пытался...
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;