指针基础(一)_c语言学习笔记

1. 指针的加减运算
    1)指针相减,表示两指针之间所相差的内存单元数或元素的个数。
    2)指针的乘、除、加的运算均没有意义

2. 指针的关系运算
    1)p1 == p2 : 表示p1和p2指向同一内存单元
    2)p1  >  p2 : 表示p1处于高地址位置

3. 数组和指针
    1)数组的指针,就是数组在内存中的起始地址,即数组变量名。
int a[10], *p;
p = a;		//或 *p = &a[0]
    2)使用数组下标访问数组元素,等价于 使用数组的指针访问数组元素。
    3)p+ia+i 都是数组元素 a[i] 地址。
    4)*(p+i)*(a+i) 就是数组元素 a[i]。
    5)p[i] 等价于 *(p+i),也等价于 a[i]
    6)数组名a是地址常量,不可对其赋值,也不可做 ++ 或 -- 运算。

4. 数组指针 — 指向多位数组的指针
    1)一般指针变量对多维数组的引用:
short int a[2][3] = { {1, 2, 3}, {4, 5, 6} };
short int *p;
p = &a[0][0];	//等价于 p = a[0];
    2)指针p指向二维数组a时,p相当于一个一维数组,访问元素可以用 p[0], .., p[5] 或 *(p+0) .., *(p+5) 来表示。

5. 二维数组中的行地址和列地址
    1)int  a[3] [2],其结构为:
  指针基础(一)_c语言学习笔记
    2)a [i](即 *(a+i) ) 既可以看成是一维数组 a 的下标为 i 的元素,又可以看成是由 a [i] [0], a [i] [1] 两个元素组成的一维整型数组的数组名,代表这个一维数组的首地址,即第一个元素 a [i] [0] 的地址(&a[i][0])。
    3)a[i]+j(即 *(a+j)+j) 代表这个数组中下标为 j 的元素的地址,即 &a[i][j]
    4)*(a[i]+j)(即*(*(a+i)+j))代表这个地址所指向的元素的值,即 a[i][j]
    5)以下四种表示元素 a[i][j] 的形式是等价的:
	a[i][j]
	*(a[i]+j)
	*(*(a+1)+j)
	(*(a+i))[j]
     6)如果将 a 看成一个行地址(第0行的地址),则 a+i 代表 a 的第 i 行的地址,a[i] 可看成一个列地址,即第 i 行第0列的地址。
    7)行地址 a 每次加1,表示指向下一行,而列地址 a[i] 每次加一,表示指向下一列。

6. 行指针
  1)以二维数组 a 为例,定义行指针p:
	//定义
	int (*p)[2];	//指定列数为2

	//初始化
	p = a;			//或 p = &a[0];
    2)使用行指针p访问二维数组 a 的元素 a[i][j] 的方法有四种:]
	p[i][j]
	*(p[i]+j)
	*(*(p+1)+j)
	(*(p+i))[j]

7. 列指针
    1)同样以二维数组 a 为例,定义列指针p:
int main ()
{
	int a[3][2] = { {7, 2}, {2, 8}, {5, 9} };

	//定义列指针p
	int *p;

	//初始化
	p = a[0];	//或 p = *a, 或 p = &a[0][0];

	printf("p[3] = %d\n", p[3]);	//输出 p[3] = 8

	return 0;
}
    2)此时,可以将 a 看成一个由(3行x2列)个元素组成的一维数组,然后像访问一维数组一样访问 a。
    3)对于列指针p, p [i] [j] 写法是错误的。

8. 指针数组
    1)当某个数组单元都是指针型数据时,这个数组被称为指针数组。
    2)定义与赋值:
int main ()
{
	char c[3] = { 'a', 'b', 'c' };

	//定义长度为3的指针型数组p
	char *p[3];

	//赋值
	p[0] = &c[0];
	p[1] = &c[1];
	p[2] = &c[2];

	return 0;
}
    2)指针数组和二维数组行指针的区别:
 



你可能感兴趣的:(学习笔记)