鱼C论坛

 找回密码
 立即注册
查看: 1788|回复: 19

[已解决]还是关于指针,求大神帮忙

[复制链接]
发表于 2018-9-20 21:12:18 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼视频里的源代码有一个是:
#include <stdio.h>

int main()
{
    char *p1[5] = {
        "让编程改变世界 -- 鱼C工作室",
        "Just do it -- NIKE",
        "一切皆有可能 -- 李宁",
        "永不止步 -- 安踏",
        "One more thing... -- 苹果"
    };
    int i;
   
    for (i = 0; i < 5; i++)
    {
        printf("%s\n", p1[i]);
    }
   
    return 0;
}

此时输出的是指针数组里的每一个内容,但是我理解不加*的指针名不是取指针地址的意思么?然后我把printf("%s\n", p1[i]);改成了printf("%p\n", p1[i]);此时就输出了4个地址,那么为什么前面也可以运行出来?指针对应的类型不应该是%p么?
求解!
最佳答案
2018-9-21 00:15:28
这个解释要比较长。 char p[5]; 是指 p是一个数组,它所存储的内容是字符型。现在多了 *,所以存储的内容是【指向字符型的指针】
字符串其实是数组,只要有指针找到第一个元素的地址就可以把数组的全部内容给找出来。
* 不是取地址,要看左右值。在等号左边是取地址,没有等号或在等号右边是取值,叫解引用。用下标的方式 [ ] 等同解引用。
为什么要在外面加 * 呢?如果不加,就只能存储 4  个字符。
可以打印出字符串是因为 %s。%p 会是该字符串的首地址而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-20 21:21:11 | 显示全部楼层
%s是输出字符串,他需要给他一个指针,它输出指针指向内存空间的内容,他会一直读到‘\0’为止;
%p是输出指针本身的值,也就是它存的地址。
不加*的指针名就是指针本身啊,还取什么地址啊,取地址不就变成二级指针了吗...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 22:28:33 | 显示全部楼层
moc 发表于 2018-9-20 21:21
%s是输出字符串,他需要给他一个指针,它输出指针指向内存空间的内容,他会一直读到‘\0’为止;
%p是输出 ...

指针本身又代表什么啊?感觉晕了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 23:09:11 From FishC Mobile | 显示全部楼层
albus12 发表于 2018-9-20 22:28
指针本身又代表什么啊?感觉晕了。。

指针可以当作是标签,想标什么变量,就用对应的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 00:15:28 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
这个解释要比较长。 char p[5]; 是指 p是一个数组,它所存储的内容是字符型。现在多了 *,所以存储的内容是【指向字符型的指针】
字符串其实是数组,只要有指针找到第一个元素的地址就可以把数组的全部内容给找出来。
* 不是取地址,要看左右值。在等号左边是取地址,没有等号或在等号右边是取值,叫解引用。用下标的方式 [ ] 等同解引用。
为什么要在外面加 * 呢?如果不加,就只能存储 4  个字符。
可以打印出字符串是因为 %s。%p 会是该字符串的首地址而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 07:20:35 | 显示全部楼层
本帖最后由 啊涂涂 于 2018-9-21 07:25 编辑

因为输出字符串本身就不需要加别的什么,只把字符串的名字写上去就行了。

这里的p【i】就用的是数组的下标法访问,p【1】就到了第一个字符串数组,然后以%s类型输出。p【2】就是到了第二个字符串数组,然后再输出!

你加的%p的意思就是把这字符串的地址给输出出来,也就是字符串首字母的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 07:27:13 | 显示全部楼层
albus12 发表于 2018-9-20 22:28
指针本身又代表什么啊?感觉晕了。。

这一题的指针本身的地址就是他五个指针数组中第一个指针的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 09:25:41 From FishC Mobile | 显示全部楼层
啊涂涂 发表于 2018-9-21 07:20
因为输出字符串本身就不需要加别的什么,只把字符串的名字写上去就行了。

这里的p【i】就用的是数组的下 ...

P[1]相当于*P1?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 09:36:16 | 显示全部楼层

p1是p【1】的指针,因为数组名就是数组第一个元素的地址。

所以取p1这个地址指向的值就取到了p【1】,所以p【1】== *p1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 20:44:14 | 显示全部楼层
claws0n 发表于 2018-9-21 00:15
这个解释要比较长。 char p[5]; 是指 p是一个数组,它所存储的内容是字符型。现在多了 *,所以存储的内容是 ...

以下几个情况:
*p=a;意思是此时是指取a的地址给指针,可以通过指针p读取a;这个理解对吗?
但是a=*p和*p这个取值是取哪个值啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 20:49:06 | 显示全部楼层
啊涂涂 发表于 2018-9-21 07:20
因为输出字符串本身就不需要加别的什么,只把字符串的名字写上去就行了。

这里的p【i】就用的是数组的下 ...

是不是可以理解成printf函数可以根据需要输出的类型来进行输出,比如说printf(“%p”,p【i】)它自动输出地址,
printf(“%s”,p【i】)就输出指针指向的字符串?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 22:42:12 | 显示全部楼层
albus12 发表于 2018-9-21 20:44
以下几个情况:
*p=a;意思是此时是指取a的地址给指针,可以通过指针p读取a;这个理解对吗?
但是a=*p ...

*p=a;意思是此时是指取a的地址给指针,可以通过指针p读取a;这个理解对吗? ok, 但是,如果这样写,a 肯定不是存量(数组、字符串……),而 p 的跨度为 1

但是a=*p和*p这个取值是取哪个值啊?
应该是说有另外一个变量 b = *p;那么 b 会被赋于 a 的首元素的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 22:49:21 | 显示全部楼层
claws0n 发表于 2018-9-21 22:42
*p=a;意思是此时是指取a的地址给指针,可以通过指针p读取a;这个理解对吗? ok, 但是,如果这样写,a 肯 ...

感谢您的回复,b=*p就是说把指针p指向的值赋予给b,此时给的是不是地址,*p=a给地址在指针里,相当于中间中转了一下?
还有就是,是不是可以理解成printf函数可以根据需要输出的类型来进行输出,比如说printf(“%p”,p【i】)它自动输出地址,
printf(“%s”,p【i】)就输出指针指向的字符串?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 23:01:30 | 显示全部楼层
albus12 发表于 2018-9-21 22:49
感谢您的回复,b=*p就是说把指针p指向的值赋予给b,此时给的是不是地址,*p=a给地址在指针里,相当于中间 ...

b=*p 就是说把指针p指向的值赋予给b  //对
*p=a //这个是在声明的时候就赋值了吧?
如果按照我的安排,应该是值,因为解引用了。没有试过~

printf() 是格式化输出,会把输出给修成对应的格式,但不是转型。
printf(“%s”,p【i】)就输出指针指向的字符串?对,因为下标的方式等同解引用,所以是字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 23:11:05 | 显示全部楼层
claws0n 发表于 2018-9-21 23:01
b=*p 就是说把指针p指向的值赋予给b  //对
*p=a //这个是在声明的时候就赋值了吧?
如果按照我的安排, ...

哦,所以如果是%p的话那就是解引用得地址了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 23:13:37 | 显示全部楼层
albus12 发表于 2018-9-21 23:11
哦,所以如果是%p的话那就是解引用得地址了吧

不是,%p 是十六进制,跟解不解引用没有关系……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 23:22:08 | 显示全部楼层
claws0n 发表于 2018-9-21 23:13
不是,%p 是十六进制,跟解不解引用没有关系……

printf遇见%s则输出字符串,遇见%d就是地址,请问下有没有*p【i】这种形式,它应该是意味着指针的指针了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 23:27:41 | 显示全部楼层
albus12 发表于 2018-9-21 23:22
printf遇见%s则输出字符串,遇见%d就是地址,请问下有没有*p【i】这种形式,它应该是意味着指针的指针了 ...

%d 是十进制的数字,%p 是十六进制的,但用 %0.8X 比较好
你的情况,*p 好像会报错~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-22 08:52:20 | 显示全部楼层
albus12 发表于 2018-9-21 23:11
哦,所以如果是%p的话那就是解引用得地址了吧


哦,
  1. printf("%p", p[i]);
复制代码
确实只有首地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-22 22:45:27 | 显示全部楼层
claws0n 发表于 2018-9-22 08:52
哦, 确实只有首地址

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 00:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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