您的位置:首页 > 编程语言 > C语言/C++

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]就很好理解了。以上为个人理解。

注:

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]均为指针变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针