C语言学习笔记——指针
2015-07-11 22:05
363 查看
1.指针必须先初始化
int *p;
*p = 3;//不合法
2.指针变量可以改变自身的值,如p++是合法的;而数组名是常量,int a[],a++是非法的
3.假设二维数组a[3][4],那么a[1],a+1,*(a+1),&a[1][0]都表示第二行元素的首地址
问:为什么a[1],a+1,*(a+1),&a[1][0]都能表示第二行元素的首地址?
解:如果把二维数组当做一位数组来看,那么a[3][4]可以看做一位数组a[3],而a[3]中的每个元素都是一个含有四个元素的一位数组,由于数组名a代表数组首地址,所以a+1代表第二个元素的地址(即第二个一维数组的首地址),又由于a[1]和*(a + 1)都表示第二个元素的值,而这里的每个元素又是一个一维数组,所以a[1]和*(a+1)实际上是 第二个一维数组的首地址,故a[1],a+1,*(a+1)都是等价的。&a[1][0]就很好理解了。以上为个人理解。
注:
4.此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。
5.a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]
6.当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为C语言对指针变量赋值时要给以确定的地址。
7.函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
8.二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"两边的括号不可少。而指针数组类型表示的是多个指针(一组有序指针)在一般形式中"*指针数组名"两边不能有括号。例如:
int (*p)[3];
表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。
int *p[3]
表示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。
int *p;
*p = 3;//不合法
2.指针变量可以改变自身的值,如p++是合法的;而数组名是常量,int a[],a++是非法的
3.假设二维数组a[3][4],那么a[1],a+1,*(a+1),&a[1][0]都表示第二行元素的首地址
问:为什么a[1],a+1,*(a+1),&a[1][0]都能表示第二行元素的首地址?
解:如果把二维数组当做一位数组来看,那么a[3][4]可以看做一位数组a[3],而a[3]中的每个元素都是一个含有四个元素的一位数组,由于数组名a代表数组首地址,所以a+1代表第二个元素的地址(即第二个一维数组的首地址),又由于a[1]和*(a + 1)都表示第二个元素的值,而这里的每个元素又是一个一维数组,所以a[1]和*(a+1)实际上是 第二个一维数组的首地址,故a[1],a+1,*(a+1)都是等价的。&a[1][0]就很好理解了。以上为个人理解。
注:
int a[3][4]; int *p; p = a; //<span style="font-family: Arial, Helvetica, sans-serif;">C中合法,C++中无法编译</span>
4.此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。
5.a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]
6.当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为C语言对指针变量赋值时要给以确定的地址。
7.函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
8.二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"两边的括号不可少。而指针数组类型表示的是多个指针(一组有序指针)在一般形式中"*指针数组名"两边不能有括号。例如:
int (*p)[3];
表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。
int *p[3]
表示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。
相关文章推荐
- 关于指针的一些事情
- Lua和C语言的交互详解
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 探讨C语言的那些小秘密之断言
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C++智能指针实例详解
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- C语言进制转换代码分享
- 基于C语言fflush()函数的使用详解
- C语言单链队列的表示与实现实例详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy
- Lua教程(四):在Lua中调用C语言、C++的函数