c指针理解问题

发布于 2024-12-11 04:32:31 字数 953 浏览 0 评论 0原文

请看下面的代码并告诉我 ***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();
}

Please have a look at the following code and tell me where does ***ptr locates ?
i.e. i have a feelings that ***ptr actually locates at ptr[0][0][0]
Am I wrong ? The following is a 3d representation of pointer. where I am trying to assign some characters and later i wanted to test what is the index of ***ptr? will be waiting

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

执着的年纪 2024-12-18 04:32:31

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

回答你的问题,是的,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,请包含
  • 优先选择局部变量(ij)而不是全局变量,尤其是 for 循环。
  • 还有一些其他的小改动……

PS。 ?真的吗?你还在用 Turbo-C 还是什么?

First of all, I find your coding style extremely hard to read.

Answering your question, yes, ptr[0][0][0] is a synonym of ***ptr. Thats because a[b] is by definition equal to *(a+b), so ptr[0] is equal to *ptr, etc.

Said that, here is my version of your code:

#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;
}

Note the following changes:

  • Never write void main in C or C++. And throw away any book that prints it.
  • The argument of malloc is usually the number of elements times the size of the element. Place special attention to the real type that you intend to use.
  • The return of malloc is usually cast to the type pointer-to-the-type-of-the-element.
  • The index in the arrays should be i and j, not row and rw.
  • Why all the *(ptr + x) stuff? That's why we have the ptr[x] syntax.
  • You probably want to use strcpy to fill your strings, but difficult to say without explaining the problem.
  • When you want to printf a pointer, use %p.
  • If you use malloc, include <stdlib.h>.
  • Prefer local variables (i, j) to global ones, particularly for loops.
  • And a few other minor changes here and there...

PS. <conio.h>? Really? Are you still using Turbo-C or what?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文