指针
c language 之精华 ----指针
(所有的规则必须向“编译器”看齐)
一、(1)定义指针变量 (2)关联指针变量 (3)解引用
二、指针星号 (*) 的用法:两种:(1)表明指针类型 (2)解引用,表明指针指向指针变量
取地址符(&)
指针的初始化:(初始化并赋值) int a =21; int *p=&a; //第一种用法,定义指针
( 不初始化时先定义再赋值) int a=21; int *p; p=&a; //本质的区别就是将 a的地址付给指针变量p
*p = &a; //这么初始是错误的,这属于解应用,是将a地址所绑定的值付给了指针变量p
左值、右值:
三、野指针:
野指针的三种情况:(1)指向不可不可访问的空间(比如内核空间,操作系统不允许访问的),会造成段错误
(2)指向一个可用的空间,没有意义的空间,运行不会造成什么严重问的题,但是会掩盖问题
让人误以为自己的程序没什么问题但是其实是有问题的
(3)指向一个另个一变量正在使用的空间,这种情况会导致程序崩溃,终止
四、数组部分:(深入学习)
1)丛内存角度讲,数组变量就是一次分配多个变量,而且这多个变量在内存中的存储单元是依次相连接的
(2)我们分开定义多个变量(譬如inta,b,c,d;)和一次定义一个数组(int a[4]);这两种定义方法相同点是都定义了4个int型变量,而且这4个变量都是独立的单个使用的;不同点是单独定义时a、b、c、d在内存中的地址不一定相连,但是定义成数组后,数组中的4个元素地址肯定是依次相连的。
(3)数组中多个变量虽然必须单独访问,但是因为他们的地址彼此相连,因此很适合用指钍来操作,因此数组和指针天 生就叫纠结在一起
3.5.2、从编译器角度来理解数组
1)丛编译器角度来讲,数组变量也是变量,和普通变量和指钍变量并没有本质不同。变量的本
质就是一个地址,这个地址在编译器中决定具体数值,具体数值和变量名绑定,变量类型决定这
个地址的延续长度
(2)搞清楚:变量、变量名、变量类型这三个概念的具体含义,很多问题都清楚
int a: char a:
数组左值和右值的区别:
1)放在赋值运篁符左边的就叫左值,右边的就叫右值。所以赋值操作其实就是:左值=右值;
(2)当一个变量做左值时,编译器认为这个变量符号的真实含义是这个变量所对应的那个内存空
间;当一个变量做右值时,编译器认为这个变量符号的真实含义是这个变量的值,也就是这个变
量所对应的内存空间中存储的那个数
说白了: 左值(房子)=右值(家人)
数组:
总结
1:&a和a做右值时的区别:&a是整个数组的首地址,而a是数组首元素的首地址。这两个在数
上是相等的,但是意义不相同。意义不相同会导致他们在参与运算的时候有不同的表现。
2:a和&a[0]做右值时意义和数值完全相同,完全可以互相替代
3:&a是常量,不能做左值。
4:a做左值代表整个数组所有空间,所以a不能做左值