wxs1415 发表于 2020-8-3 11:06:27

C语言学到指针,有一些不理解

char *p = { "notepad", "calc", "write", "mspaint", "taskmgr" };
        printf("%p,%p,%p\n", p,p,*p);

        for (int i = 0; i < 5; i++)
        {
                printf("%s,%c\n", p,*p);
        }

请问这里的P和*p,是什么意思,为何一个用%s,一个%c来接收。
另外,我查看了内存地址,分别是008b6930 008b693c 008b6944 008b694c 008b6958,为何间隔不是一样大
求大佬们解答一下,万分感谢

sunrise085 发表于 2020-8-3 11:24:54

刚刚被审核了?
#include <stdio.h>

int main()
{
   
char *p = { "notepad11", "calc", "write", "mspaint", "taskmgr" };//定义了一个指针数组,实际上就是定义了五个指针
      printf("%p,%p,%p\n", p,p,*p);

      for (int i = 0; i < 5; i++)
      {
                printf("%p,\t", p);//打印指针所指向的单元的地址,因为每个字符串长度不一样,所以地址间隔也不一样,地址间隔就是字符串的长度+1,因为字符串后面会自动添加一个结束字符'\0'
                printf("%p,\t",&p);//打印指针的地址,指针也是一类变量,也有自己的地址,每个指针的长度就是8字节(与系统有关,64位系统是8字节,32位系统是4字节)
                printf("%s,\t",p);//%s是打印 字符串,后面需给出字符串的首地址,也就是指针指向的地址
                printf("%c\n",*p);//*p是指针所指向单元的内容,指针指向了字符串首地址,所以该单元的内容实际上就是字符串的首字母。
      }
    return 0;
}

chxchxkkk 发表于 2020-8-3 12:10:44

char *p是一个指针数组,它包含5个char *类型的元素,p是每个元素的首地址,*p 是取出所指地址的内容。详细解释如楼上

wxs1415 发表于 2020-8-3 13:48:14

sunrise085 发表于 2020-8-3 11:24
刚刚被审核了?

非常感谢大佬的回答,一下子理解了很多。可是你说的地址间隔是字符串的长度+1,但是我运行的结果不是这样的呀,我用的是VS2013.

wxs1415 发表于 2020-8-3 13:48:48

chxchxkkk 发表于 2020-8-3 12:10
char *p是一个指针数组,它包含5个char *类型的元素,p是每个元素的首地址,*p 是取出所指地址的内容。 ...

谢谢大佬解答,现在懂了{:5_91:}
页: [1]
查看完整版本: C语言学到指针,有一些不理解