苏嵌学习linux C的第三天:指针pointer(个人小结)
2018-01-27 21:10
253 查看
之前写的一些博客,有些内容是没有必要讲的,之后的博客我就提一下我对当天所学内容的理解和注意点吧。
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、& 运算符一起使用时数组名才表示整个数组,表达式中的数组名会被转换为一个指向数组首地址的指针。
我给出一张表,是掌握的重点。
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、& 运算符一起使用时数组名才表示整个数组,表达式中的数组名会被转换为一个指向数组首地址的指针。
我给出一张表,是掌握的重点。
相关文章推荐
- c语言中函数传指针学习小结
- c++ primer 学习之路 (19)4.8 指针、数组和指针算术 4.8.2 指针小结
- 苏嵌学习小结
- php 学习阶段行 个人小结
- C/C++学习笔记--指针(Pointer)
- springMVC学习,个人入门学习小结。
- php学习个人小结
- Thinkcpp学习笔记 c11 成员指针 Pointer to member
- 指针初步说明小结(C++学习笔记)
- Android之binder驱动个人学习小结
- linux c 一站式学习 C语言中数组名和指针的区别
- jsp问题(仅仅是菜鸟级别的个人学习小结)
- linux C 学习---函数指针
- Android之binder驱动个人学习小结
- 黑马程序员学习笔记-C指针小结
- 学习点滴记录之三指针小结
- [Pointer]C中指针与多维数组学习
- c指针学习小结(参考别人总结的经验)
- 苏嵌学习linux C的C语言第一天(个人总结)
- C语言学习笔记(十) -指针下 Pointer