#c #pointers
#c #указатели
Вопрос:
Пожалуйста, взгляните на следующий код и скажите мне, где ***ptr
находится? т. Е. У меня есть чувства, которые ***ptr
на самом деле находятся в ptr[0][0][0]
, я не прав? Ниже приведено 3D-представление указателя. где я пытаюсь назначить некоторые символы, а позже я хотел проверить, что такое индекс ***ptr
? будет ждать
#include<stdio.h>
#include<conio.h>
#define row 5
#define rw 3
#define col 10
char ***ptr;
int i,j,k;
void main()
{
clrscr();
ptr=(char *)malloc(row*sizeof(char *));
for(i=0;i<row;i )
{
*(ptr row)=(char *)malloc(rw*sizeof(char *));
printf("t:n");
for(j=0;j<rw;j )
{
*(*(ptr row) rw)=(char *)malloc(col*sizeof(char *));
if(i==0 amp;amp; j==0)
{ // *(*(ptr row) rw)="kabul";
**ptr="zzz";
}
else
*(*(ptr row) rw)="abul";
printf("taddress=%d %d%d = %sn",((ptr row) rw),i,j,*(*(ptr row) rw));
}
printf("n");
}
printf("%c %d",***ptr,ptr);
getch();
}
Комментарии:
1. вы делаете одну вещь неправильно (2 раза). назначение памяти местоположению * (ptr строка) записывает его в одно место (только одно, даже если это цикл. вам нужно записать его в *(ptr i) (повторите со всеми malloc в циклах
2. чувак, я пытаюсь реализовать здесь 3D-массив. итак, я не должен иметь 2d-цикл для 2-го индекса и 3-го индекса и заканчивать записью malloc 3 раза в коде?
3. Возможно, вы пытаетесь создать двумерный массив строк? Из вашего кода я не уверен, что вы пытаетесь сделать…
4. ptr[0][0]= «abul» означает ptr[0][0][0]==’ a’ в этом случае я создал 3D-массив. что я пытаюсь узнать, так это то, какова эквивалентная индексация для *** ptr??? поскольку мы можем назначить *** ptr=’p’, где это? Для этого должна быть точка индексации… не так ли?
Ответ №1:
Прежде всего, я нахожу ваш стиль кодирования чрезвычайно сложным для чтения.
Отвечая на ваш вопрос, да, ptr[0][0][0]
это синоним ***ptr
. Это потому a[b]
, что по определению равно *(a b)
, поэтому ptr[0]
равно *ptr
и т.д.
Сказал, что вот моя версия вашего кода:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define row 5
#define rw 3
#define col 10
char ***ptr;
int main()
{
int i, j;
ptr = (char***)malloc(row * sizeof(char **));
for(i = 0; i < row; i )
{
ptr[i]= (char**)malloc(rw * sizeof(char *));
printf("t:n");
for(j = 0; j < rw; j )
{
ptr[i][j] = (char*)malloc(col * sizeof(char));
if (i == 0 amp;amp; j == 0)
{
strcpy(ptr[i][j], "zzz");
}
else
{
strcpy(ptr[i][j], "abul");
}
printf("taddress=%p %d,%d = %sn", ptr[i][j], i, j, ptr[i][j]);
}
printf("n");
}
return;
}
Обратите внимание на следующие изменения:
- Никогда не пишите
void main
на C или C . И выбросьте любую книгу, которая ее печатает. - Обычно аргументом
malloc
является количество элементов, умноженное на размер элемента. Уделите особое внимание реальному типу, который вы собираетесь использовать. - Возврат
malloc
обычно приводится к типу указатель на тип элемента. - Индекс в массивах должен быть
i
andj
, а неrow
andrw
. - Зачем все
*(ptr x)
это? Вот почему у нас естьptr[x]
синтаксис. - Вероятно, вы хотите использовать
strcpy
для заполнения своих строк, но трудно сказать, не объяснив проблему. - Если вы хотите
printf
указать указатель, используйте%p
. - Если вы используете
malloc
, включите<stdlib.h>
. - Предпочитайте локальные переменные (
i
,j
) глобальным, особенно для циклов. - И несколько других незначительных изменений здесь и там…
PS. <conio.h>
? Действительно? Вы все еще используете Turbo-C или что?
Комментарии:
1. Разве вы не знали, что разработчики MS-DOS сейчас пользуются большим спросом! 😉
2. @Maverick_Mrt Никто не смеется над вами, но если вы не хотите, чтобы ваш код подвергался критике, вы не должны публиковать его в Интернете.