2011-10-21 141 views
1

请看下面的代码并告诉我***ptr在什么位置? 即我有一种感觉,***ptr实际上位于ptr[0][0][0] 我错了吗?以下是指针的三维表示。在那里我想分配一些字符,后来我想测试***ptr的索引是什么?将等待c指针理解问题

#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(); 
} 
+0

你做错了一件事(2次)。将内存分配给位置*(ptr + row)将其写入一个位置(即使它是一个循环,也只有一个位置),您需要将它写入*(ptr + i)(循环中的所有malloc重复执行 – fazo

+0

伙计im试图实现3D数组在这里,所以mi不应该有第二个索引和第三个索引的2d循环,并最终在代码中写入malloc 3次? –

+0

您是否试图创建一个二维数组的字符串?我不确定你在做什么...... – Manos

回答

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>
  • 优先考虑局部变量(i,j)到全局变量,特别是循环。
  • 在这里和那里其他一些小的改动...

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

+0

难道你不知道,MS-DOS开发者现在正在高需求! ;) – Peter

+0

@Peter哦,我知道这太好了...... – rodrigo

+0

@Maverick_Mrt没有人在取笑你,但是如果你不想让你的代码受到批评,你不应该把它发布到互联网上。 – rodrigo