鱼C论坛

 找回密码
 立即注册
查看: 1503|回复: 14

[已解决]c指针问题

[复制链接]
发表于 2021-3-15 23:06:47 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 shiwobuhaoma 于 2021-3-15 23:12 编辑

int i =1 , a;
int *p ;   //定义一个整型指针变量p
p = & i;  //指针p指向变量 i 的地址;
a = *p; //这里的*p是什么意思?是取指针变量里的值1?然后赋值给a
*p = 100; //如果上面一句理解正确的话,那这里的*p该如何理解?只有i的别名可以说的通,如果还是理解成取指针变量里的值1,逻辑说不过去。所以*p在这几行代码里,不同的位置,代表的意思不一样。

总结有3种情况:
1,在第二行声明变量时;
2,在第四行等号右边时;
3,在第五行等号左边时。

1的情况最简单不讨论,2的情况代表指针变量p指向内存地址里存放的值。3的情况就是起别名。

这里不知道自己总结的对不对?
还有就是:

printf("p= %p",p);//这里又单独的使用了p,没带*,但是它代表的意思就是指针变量,打印会打新一个地址。这里又和声明指针变量p时不一样,因为声明指针变量p时带*了。

printf("p=%d",*p);//这里出现的情况都不是之前总结的3种情况,但是意思应该和3种情况一样,所以第3种情况的总结不一定全对,需要补充。

也许还有其他的情况没有考虑到。
谁能系统的总结一下,带*和不带*,在什么情况下分别代表什么意思?
最佳答案
2021-3-15 23:39:10
本帖最后由 jackz007 于 2021-3-15 23:48 编辑
int i = 1 , a ;
int * p       ; // 定义一个整型指针变量 p
p = & i       ; // 指针 p 指向变量 i 的地址;
a = * p       ; // * p 就是 i,这一句就是 a = i,也就是说,让 a 的值等于 i,因为 p 指向 i
* p = 100     ; // 同理,这一句就是 i = 100,也就是说为 i 赋值 100,因为 p 指向 i 
       指针前面不带 * 代表内存地址,带上 * 代表内存中的存储内容。
printf("p= %p",p) ; // 指针 p 前面不带 *,打印出来就是内存地址 。
printf("p=%d",*p) ; // 指针 p 前面带有 *,代表内存地址中存储的整型数

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-15 23:39:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-3-15 23:48 编辑
int i = 1 , a ;
int * p       ; // 定义一个整型指针变量 p
p = & i       ; // 指针 p 指向变量 i 的地址;
a = * p       ; // * p 就是 i,这一句就是 a = i,也就是说,让 a 的值等于 i,因为 p 指向 i
* p = 100     ; // 同理,这一句就是 i = 100,也就是说为 i 赋值 100,因为 p 指向 i 
       指针前面不带 * 代表内存地址,带上 * 代表内存中的存储内容。
printf("p= %p",p) ; // 指针 p 前面不带 *,打印出来就是内存地址 。
printf("p=%d",*p) ; // 指针 p 前面带有 *,代表内存地址中存储的整型数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-15 23:59:23 From FishC Mobile | 显示全部楼层
本帖最后由 shiwobuhaoma 于 2021-3-16 00:04 编辑
jackz007 发表于 2021-3-15 23:39
指针前面不带 * 代表内存地址,带上 * 代表内存中的存储内容。


a=*p; 因为p指向i的地址,所以*p中的*是解引用的意思,取变量i的地址里面保存的值1赋值给a。

上面我自己的分析对吗?如果对,那下面
*p=100;这里的*p该如何解释?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 00:16:10 | 显示全部楼层
shiwobuhaoma 发表于 2021-3-15 23:59
a=*p; 因为p指向i的地址,所以*p中的*是解引用的意思,取变量i的地址里面保存的值1赋值给a。

上面我 ...


        我都已经说的很明白了,* p = 100 就是为 p 所指的变量赋值 100,难道还不够清楚?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 00:26:36 | 显示全部楼层
本帖最后由 jackz007 于 2021-3-16 00:29 编辑

      通过这个代码加深理解和体会
#include <stdio.h>

int main(void)
{
        int a = 123 , b = 321 , c , * p = & a , * q = & b ;
        printf("a = %d , b = %d\n" , a , b)               ;
        c = a                                             ; // c = a
        * p = * q                                         ; // a = b 
        * q = c                                           ; // b = c
        printf("a = %d , b = %d\n" , a , b)               ;
}
        编译、运行实况
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
a = 123 , b = 321
a = 321 , b = 123

D:\00.Excise\C>

        这个代码虽然没有对 a 和 b 赋值的操作,但是,a 和 b 的内容已经通过指针被互换掉了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 08:36:25 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-3-16 00:26
通过这个代码加深理解和体会

        编译、运行实况

首先感谢您的耐心解答!
但我我想弄明白*出现在不同位置时,*分别代表什么意思?或者说如何用文字去解释它?
1、int *p;//在这里*代表声明一个指针。
2、a = *p;//在这里*代表解引用(取内存地址中的值)。
3、*p = *q;//在您举的例子中,这里*分别代表什么意思?
4、*p = 100;//在这里*代表什么意思?
5、*p = a;//在这里*代表什么意思?
6、printf("p=%d",*p) ; // 在这里 *代表解引用的意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 09:24:59 | 显示全部楼层
本帖最后由 jackz007 于 2021-3-16 09:49 编辑
shiwobuhaoma 发表于 2021-3-16 08:36
首先感谢您的耐心解答!
但我我想弄明白*出现在不同位置时,*分别代表什么意思?或者说如何用文字去解释 ...

         int a = 123 , * p = & a   // p 指向变量 a , 从此以后, * p 就是 a ,p 前面带星号,是因为在定义指针。
         int b = 321 , * q = & b   // q 指向变量 b , 从此以后, * q 就是 b ,q 前面带星号,是因为在定义指针。
        如果把定义和赋值分开,就是这个样子
         int a , b , * p , * q ; // 定义变量
         a = 123               ; // 为变量 a 赋值
         b = 321               ; // 为变量 b 赋值
         p = & a               ; // 指针 p 指向 a,只要这个关系不变(p 不被重新赋值),那么,从此以后,* p 就是 a
         q = & b               ; // 指针 q 指向 b,只要这个关系不变(q 不被重新赋值),那么,从此以后,* q 就是 b

         p 和 a,q 和 b 建立联系后,修改 a、b 就是修改  * p 、* q;修改 * p、* q 就是修改 a,b;交换 * p、* q 的值就是交换 a、b 的值;交换 a、b 的值就是交换 * p、* q 的值。看明白了吗?
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 09:50:46 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-3-16 09:24
如果把定义和赋值分开,就是这个样子

大哥,解引用这个词是小甲鱼教的。
我明白您的解释,代码我也能看懂。
但是针对*p = *q;这里面的*代表什么意思?
我只问*的意思,因为一个符号有多种意思,用法也不一样。它在声明或者定义的时候,*就是声明或者定义一个指针。不在声明和定义的时候,有时候它表示的取内存中存储的值。像*p = *q;这刚代码里面,*p的*代表什么意思?*q的*代表什么意思?
重点是问*的意思。谢谢!
这个*还有没有其他意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 09:59:40 | 显示全部楼层
本帖最后由 jackz007 于 2021-3-16 10:02 编辑
shiwobuhaoma 发表于 2021-3-16 09:50
大哥,解引用这个词是小甲鱼教的。
我明白您的解释,代码我也能看懂。
但是针对*p = *q;这里面的*代表 ...


       你不要考虑 * 有多种意思,* p 、* q 在这里只有一个意思,就是内存地址 p、q 中存储的内容,也就是变量 a 和 b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 11:15:39 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-3-16 09:59
你不要考虑 * 有多种意思,* p 、* q 在这里只有一个意思,就是内存地址 p、q 中存储的内容,也 ...

探讨一个问题,不应该刨根问底吗?不然都不知道为什么。
刚才我通过查资料,终于找到了合理的解释。
*p = *q;
1、=左边是*p的时候,表示的意思是和声明或者定义时候一样,就是指针变量p的意思。
2、=右边是*q的时候,表示的意思是取指针q所指向的变量的地址里面的值。
3、=左边是p的时候,表示要接收一个变量的内存地址。//p=&a;如果是p=100;这是不对的!
4、int *p;就是声明一个整型的指针变量p。
5、printf("*p = %d", *p);这里*p是和第2种情况一样。

这里容易混淆的地方是=左边是p或者*p的时候,虽然都表示指针变量p,但是它们2个接收的值是不一样的。p接收一个变量的内存地址,*p接收的是一个值,而且这个值会改变指针p指向的变量里的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 11:28:42 | 显示全部楼层
本帖最后由 jackz007 于 2021-3-16 11:31 编辑
shiwobuhaoma 发表于 2021-3-16 11:15
探讨一个问题,不应该刨根问底吗?不然都不知道为什么。
刚才我通过查资料,终于找到了合理的解释。
*p ...


        给你一个衷告,不要怀疑一个有 30 年经历老 Cracker 告诉你的任何一句话,尤其还是一个新手!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 12:39:38 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-3-16 11:28
给你一个衷告,不要怀疑一个有 30 年经历老 Cracker 告诉你的任何一句话,尤其还是一个新手! ...

您说的都没错,也确实厉害,向您学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 14:50:36 | 显示全部楼层
带*就是取值,不带*就是存这个值的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 14:53:06 | 显示全部楼层
shiwobuhaoma 发表于 2021-3-16 09:50
大哥,解引用这个词是小甲鱼教的。
我明白您的解释,代码我也能看懂。
但是针对*p = *q;这里面的*代表 ...

其他意思就是乘法运算了哈,不要记什么解引用啥的,记住*p就是取变量的值,p就是取变量的地址,这个清楚了就不迷糊了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-17 10:06:45 From FishC Mobile | 显示全部楼层
海-啵啵鱼 发表于 2021-3-16 14:50
带*就是取值,不带*就是存这个值的地址

按照您的这个说法去理解的话,*p = *q;常量赋值常量说的过去吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 21:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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