проблема с пониманием указателя c

#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 and j , а не row and rw .
  • Зачем все *(ptr x) это? Вот почему у нас есть ptr[x] синтаксис.
  • Вероятно, вы хотите использовать strcpy для заполнения своих строк, но трудно сказать, не объяснив проблему.
  • Если вы хотите printf указать указатель, используйте %p .
  • Если вы используете malloc , включите <stdlib.h> .
  • Предпочитайте локальные переменные ( i , j ) глобальным, особенно для циклов.
  • И несколько других незначительных изменений здесь и там…

PS. <conio.h> ? Действительно? Вы все еще используете Turbo-C или что?

Комментарии:

1. Разве вы не знали, что разработчики MS-DOS сейчас пользуются большим спросом! 😉

2. @Maverick_Mrt Никто не смеется над вами, но если вы не хотите, чтобы ваш код подвергался критике, вы не должны публиковать его в Интернете.