之前写的一些博客,有些内容是没有必要讲的,之后的博客我就提一下我对当天所学内容的理解和注意点吧。
CPU访问内存需要的是地址,而不是变量和函数。数据在内存中的地址称为指针。指针的最小地址为0。当它作为一个变量时,他就是指针变量。
不管是int、char、float,它们的指针和指针变量都占4个字节。
指针在使用之前一定要初始化,否则会指向一个我们不知道的地址。小模式中,低字节保存在低地址;大模式中,高字节保存在低地址中。
在指针里面,函数名、字符串名和数组名表示的是数组的首地址。
*与&的区别,简单概括:* 是取值,& 是取址。
举个例子:假设有一个 int 类型的变量 a,pa 是指向它的指针,那么*&a和&*pa分别是什么意思呢?
*&a可以理解为*(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a仍然等价于 a。
&*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于&a),所以&*pa等价于 pa。
数组与数组指针和字符串字符串指针的注意点:
(1)数组名是常量,它的值不能改变,而数组指针是变量(除非特别指明它是常量),它的值可以任意改变。
(2)有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。
说道字符串指针,有个小细节:char *p= str 和 char *p;p = str; 意义是一样的。
在二维数组中,a[i][j] ,*(*(p+i)+j),*[&a[i][0]+j] ,*(a[i]+j) 根本上是一样的(条件:char *p=a)。
1) 指针变量可以进行加减运算,例如p++、p+i、p-=i。指针变量的加减运算并不是简单的加上或减去一个整数,而是跟指针指向的数据类型有关。
2) 给指针变量赋值时,要将一份数据的地址赋给它,不能直接赋给一个整数,例如int *p = 1000;是没有意义的,使用过程中一般会导致程序崩溃。
3) 使用指针变量之前一定要初始化,否则就不能确定指针指向哪里,如果它指向的内存没有使用权限,程序就崩溃了。对于暂时没有指向的指针,建议赋值NULL。
4) 两个指针变量可以相减。如果两个指针变量指向同一个数组中的某个元素,那么相减的结果就是两个指针之间的元素个数。
5) 数组也是有类型的,数组名的本意是表示一组类型相同的数据。在定义数组时,或者和 sizeof、& 运算符一起使用时数组名才表示整个数组,表达式中的数组名会被转换为一个指向数组首地址的指针。
我给出一张表,是掌握的重点。