vlambda博客
学习文章列表

C语言-面向指针编程-你跟计算机科班的差距就在这里

麻烦回头给up主点赞,投币,关注,谢谢大家了

全部以C语言为例,机器是64位

黑马C基础班(从P29集看起):https://www.bilibili.com/video/BV1rE41157v4

黑马C提高班:https://www.bilibili.com/video/BV1tE411G7Vb

看完视频后,建议看一下这篇博客文章,这篇文章把指针真的讲的很透彻了:https://www.cnblogs.com/lulipro/p/7460206.html

1、指针:

2、经典指针例子,看完就学会,你也算个科班出生的人了:

int a = 10;int *b = &a; int **c = &b;


image.png

1)int a = 10; //左值,定义一个int类型的a, int类型是4个字节,一个字节8个bit,a是占位符,编译器就知道我需要存个int类型,里面放个10,占据4个字节

2)int *b = &a; //int *b这是告诉编译器我需要个指针,并且这个指针指向int类型,你需要给我赋的值必须是 指向int类型的指针,&a就是符合这个要求的指针(ps:java中对象类型传给成员方法就是这样定义的,虽然是引用传递(复制了一份指针),但是实际上是可以当成实参传递,因为已经拿到了指针,就可以改变元对象的内容)

小龙再教你个方法,你都不需要看=号的右边是个什么鬼,直接看左边,int *b,从右往左读,首先是b,是占位符,然后是*,说明需要个指针,然后是int,说明需要个指向int类型的指针

3)int **c = &b; //int **c这是告诉编译器我需要个指针(思考的时候是从c的右边剥洋葱理解,记得从内往外剥),并且这个指针是指向指针的,然后被指向的指针必须是指向int类型的指针,你需要给我赋的值要满足要求,明显&b就满足这个要求

小龙再教你个方法,你都不需要看=号右边是个什么鬼,直接看左边,int c ,从右往左读,首先是c,是占位符,然后是,说明需要个指针,然后还是,说明需要个指向指针的指针,然后是int,说明最后的指向应该是个int类型的数据

4)总结:左值的意思是定义,是语法,是规矩,你写代码的时候就必须要定义好类型,右值就是符合要求的值

3、练习,写写题目,看看自己懂不懂:

1). 若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是(D)。

A. p=q; B. p=q; C. a=*q; D. q=a;

2). 若定义:int a=511, *b=&a;,则printf("%d\n", *b);的输出结果为:(D)

3). 已有定义 int a=2, *p1=&a, *p2=&a; 下面不能正确执行的赋值语句是(B)。

A. a=p1+p2; B. p1=a; C. p1=p2; D. a=p1(*p2);

最后一个答案D我说一下,首先左值肯定好理解,右值你可能有点慌,我这样做,你就明白了 a = *p1 X *p2,当然肯定是不能这么写的,我就是为了让你明白这么写的,当然聪明的你应该懂了!假如p1和p2很大,超出了int大小,你知道会发生什么么,自己去搜搜吧,不过你不是搞底层的,这些估计也不需要懂

4、总结

最后说一下我的经验,任何语言,都可以用上面的左值定义,右值赋值来理解,然后想改变原对象的属性,一定要传指针过去,很多语言可能会隐性传指针,怎么传指针过去,必须学会每种语言怎么定义对象,像JAVA对象,就可以直接new一个,虽然是引用传递(就是copy了一份指针,本质是常量指针(用c语言解释就是int const *p),意思是指向的内容不可改,但是指针可以改),然后传到成员方法里,实际上传递的就是指针;比如GO语言,我就这样定义成员方法里的map参数

image

面向指针编程,你会理解的更加透彻,而不是面向对象编程,面向对象是往上抽象了一层,面向对象只是个儿子

最后,请给up主点赞 ,投币,关注,你的肯定是我持续创作的动力,我一定会输出更优质的内容,让小伙伴的IT之路走得更顺畅一点,大家头发茂盛(不要对程序员有什么误解,我30多个做IT的朋友头发都很茂盛),大家工资20K+,谢谢大家了

typedef struct {

int a;

double b;

short c;

}A;

aaaaiiiibbbbbbbbcciiiiii,长度是24个字节