c指针问题
本帖最后由 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种情况的总结不一定全对,需要补充。
也许还有其他的情况没有考虑到。
谁能系统的总结一下,带*和不带*,在什么情况下分别代表什么意思? 本帖最后由 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 前面带有 *,代表内存地址中存储的整型数 本帖最后由 shiwobuhaoma 于 2021-3-16 00:04 编辑
jackz007 发表于 2021-3-15 23:39
指针前面不带 * 代表内存地址,带上 * 代表内存中的存储内容。
a=*p; 因为p指向i的地址,所以*p中的*是解引用的意思,取变量i的地址里面保存的值1赋值给a。
上面我自己的分析对吗?如果对,那下面
*p=100;这里的*p该如何解释? shiwobuhaoma 发表于 2021-3-15 23:59
a=*p; 因为p指向i的地址,所以*p中的*是解引用的意思,取变量i的地址里面保存的值1赋值给a。
上面我 ...
我都已经说的很明白了,* p = 100 就是为 p 所指的变量赋值 100,难道还不够清楚? 本帖最后由 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 的内容已经通过指针被互换掉了。 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) ; // 在这里 *代表解引用的意思。 本帖最后由 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 的值。看明白了吗?
jackz007 发表于 2021-3-16 09:24
如果把定义和赋值分开,就是这个样子
大哥,解引用这个词是小甲鱼教的。
我明白您的解释,代码我也能看懂。
但是针对*p = *q;这里面的*代表什么意思?
我只问*的意思,因为一个符号有多种意思,用法也不一样。它在声明或者定义的时候,*就是声明或者定义一个指针。不在声明和定义的时候,有时候它表示的取内存中存储的值。像*p = *q;这刚代码里面,*p的*代表什么意思?*q的*代表什么意思?
重点是问*的意思。谢谢!
这个*还有没有其他意思? 本帖最后由 jackz007 于 2021-3-16 10:02 编辑
shiwobuhaoma 发表于 2021-3-16 09:50
大哥,解引用这个词是小甲鱼教的。
我明白您的解释,代码我也能看懂。
但是针对*p = *q;这里面的*代表 ...
你不要考虑 * 有多种意思,* p 、* q 在这里只有一个意思,就是内存地址 p、q 中存储的内容,也就是变量 a 和 b 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指向的变量里的值。
本帖最后由 jackz007 于 2021-3-16 11:31 编辑
shiwobuhaoma 发表于 2021-3-16 11:15
探讨一个问题,不应该刨根问底吗?不然都不知道为什么。
刚才我通过查资料,终于找到了合理的解释。
*p ...
给你一个衷告,不要怀疑一个有 30 年经历老 Cracker 告诉你的任何一句话,尤其还是一个新手!!! jackz007 发表于 2021-3-16 11:28
给你一个衷告,不要怀疑一个有 30 年经历老 Cracker 告诉你的任何一句话,尤其还是一个新手! ...
您说的都没错,也确实厉害,向您学习! 带*就是取值,不带*就是存这个值的地址 shiwobuhaoma 发表于 2021-3-16 09:50
大哥,解引用这个词是小甲鱼教的。
我明白您的解释,代码我也能看懂。
但是针对*p = *q;这里面的*代表 ...
其他意思就是乘法运算了哈,不要记什么解引用啥的,记住*p就是取变量的值,p就是取变量的地址,这个清楚了就不迷糊了 海-啵啵鱼 发表于 2021-3-16 14:50
带*就是取值,不带*就是存这个值的地址
按照您的这个说法去理解的话,*p = *q;常量赋值常量说的过去吗?
页:
[1]