鱼C论坛

 找回密码
 立即注册
查看: 1129|回复: 6

[已解决]关于的指针求助

[复制链接]
发表于 2021-2-15 22:32:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
到指针这里一直很懵,指针变量不是储存地址的吗,
#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;
}
感谢您的解答
最佳答案
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函数的源码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[0]) ; // 'h' 
        printf("%c\n" , p[1]) ; // 'e'
        printf("%d\n" , q[0]) ; // 0
        printf("%d\n" , q[2]) ; // 2
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢您的解答,不过我的疑问点并不在这里。
我的问题是
在printf(“p=%s”,p)中,p作为一个指针,为什么可以通过%s输出其指向的字符串“hello”
而不是通过*p访问hello呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

        printf() 就是这样规定的, 要求在打印输出字符串的时候,提供的参数是字符串开始地址,剩下的事情就不用管了。这是一个规定,不要追究为什么,遵守会用就好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-16 19:18:25 | 显示全部楼层
其实在printf规范里面,%s是通过地址索引来输出它的字符串,而其他的类如%d%x都是以它的进制来输出地址位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-18 12:29:52 | 显示全部楼层
字符串、流、'\0'

字符串在内存中是依次顺序存储的,并以字符'\0'作为结束标志。可以理解为,一个有n个字符的字符串在内存中是一个类型为char,长度为n+1的字符数组。
对字符串的操作与对文件的操作是类似的,以流的方式进行的,所以%s的作用是打印一个字符串流,给的是这个字符串流的首地址,遇到'\0'停止。
%s接受的就是一个地址,字符串的首地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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函数的源码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 18:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表