lyh33897 发表于 2021-2-15 22:32:04

关于的指针求助

到指针这里一直很懵,指针变量不是储存地址的吗,
#include<stdio.h>
int main()
{
        char a[]="hello";
        int b[]={0,1,2};
        char*p=a;
        int*q=b;
        printf("p:%p b:%p\n",p,q);
        printf("p=%s b=%d",p,*q);//p为什么%s可以输出hello,p不是地址吗?记得讲过*p才可以访问被指向的变量,数组和字符串(字符数组)有什么区别呢?
        return 0;
}
感谢您的解答

jackz007 发表于 2021-2-16 00:05:55

本帖最后由 jackz007 于 2021-2-16 00:08 编辑

       指针和数组都是内存地址,区别是前者是变量后者是常量,就是说,数组地址固定不变,而指针的值是可以变化的。指针完全可以像数组那样来索引元素。
      char a[]="hello"      ;
      int b[]={0,1,2}       ;
      char * p = a          ;
      int * q = b         ;
      printf("%c\n" , p) ; // 'h'
      printf("%c\n" , p) ; // 'e'
      printf("%d\n" , q) ; // 0
      printf("%d\n" , q) ; // 2
      

lyh33897 发表于 2021-2-16 09:09:35

jackz007 发表于 2021-2-16 00:05
指针和数组都是内存地址,区别是前者是变量后者是常量,就是说,数组地址固定不变,而指针的值是可 ...

感谢您的解答,不过我的疑问点并不在这里。
我的问题是
在printf(“p=%s”,p)中,p作为一个指针,为什么可以通过%s输出其指向的字符串“hello”
而不是通过*p访问hello呢?

jackz007 发表于 2021-2-16 10:12:30

lyh33897 发表于 2021-2-16 09:09
感谢您的解答,不过我的疑问点并不在这里。
我的问题是
在printf(“p=%s”,p)中,p作为一个指针,为 ...

      printf() 就是这样规定的, 要求在打印输出字符串的时候,提供的参数是字符串开始地址,剩下的事情就不用管了。这是一个规定,不要追究为什么,遵守会用就好了。

一叶枫残 发表于 2021-2-16 19:18:25

其实在printf规范里面,%s是通过地址索引来输出它的字符串,而其他的类如%d%x都是以它的进制来输出地址位置。

人中仙 发表于 2021-2-18 12:29:52

字符串、流、'\0'

字符串在内存中是依次顺序存储的,并以字符'\0'作为结束标志。可以理解为,一个有n个字符的字符串在内存中是一个类型为char,长度为n+1的字符数组。
对字符串的操作与对文件的操作是类似的,以流的方式进行的,所以%s的作用是打印一个字符串流,给的是这个字符串流的首地址,遇到'\0'停止。
%s接受的就是一个地址,字符串的首地址

do8do8do8 发表于 2021-2-18 15:35:59

char a[]="hello";
   -------------------------------------------------------------------------------------------------------------
      int b[]={0,1,2};
      char*p=a;
      int*q=b;
      printf("p:%p b:%p\n",p,q);
      printf("p=%s b=%d",p,*q);//p为什么%s可以输出hello,p不是地址吗?记得讲过*p才可以访问被指向的变量,数组和字符串(字符数组)有什么区别呢?
      return 0;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*p是访问被指向的变量,但是*p在这里的值是‘h’, 指的"hello"的第一个字母。
计算机里数组的首地址也就是第一个元素的地址就是整个数组的地址,第二个元素。。。最后一个元素地址,是可以通过第一个元素的地址加上偏移量来求得,这也是遵循高效率的原则
printf里的%s占位符,取得是整个字符数组的。所以要给它素组的首地址p. 但是要是硬给它个*p,得把%s换成%c
若是要求完整的答案,可以去看一下printf函数的源码。
页: [1]
查看完整版本: 关于的指针求助