c指针理解问题

时间:2011-10-21 20:52:32

标签: c pointers

请查看以下代码并告诉我***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 && j==0)
               {       //   *(*(ptr+row)+rw)="kabul";
            **ptr="zzz";

               }
           else
            *(*(ptr+row)+rw)="abul";
           printf("\taddress=%d %d%d = %s\n",((ptr+row)+rw),i,j,*(*(ptr+row)+rw));

           }

         printf("\n");
    }


printf("%c %d",***ptr,ptr);
getch();
}

1 个答案:

答案 0 :(得分:2)

首先,我发现你的编码风格极难阅读。

回答你的问题,是的,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 && j == 0)
            {
                strcpy(ptr[i][j], "zzz");
            }
            else
            {
                strcpy(ptr[i][j], "abul");
            }
            printf("\taddress=%p %d,%d = %s\n", ptr[i][j], i, j, ptr[i][j]);

        }
        printf("\n");
    }
    return;
}

请注意以下更改:

  • 永远不要在C或C ++中编写void main。扔掉任何印刷它的书。
  • malloc的参数通常是元素的数量乘以元素的大小。特别注意您打算使用的真实类型。
  • malloc的返回通常会转换为指向该元素类型的类型。
  • 数组中的索引应为ij,而不是rowrw
  • 为什么所有*(ptr + x)的东西?这就是我们使用ptr[x]语法的原因。
  • 您可能希望使用strcpy填充字符串,但如果不解释问题则很难说。
  • 如果您想要printf指针,请使用%p
  • 如果您使用malloc,请加入<stdlib.h>
  • 首选局部变量(ij)为全局变量,尤其是循环变量。
  • 还有其他一些小小的变化......

PS。 <conio.h>?真?你还在使用Turbo-C还是什么?