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

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

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

3. 数组和指针
1)数组的指针,就是数组在内存中的起始地址,即数组变量名。[/size]

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

4. 数组指针 — 指向多位数组的指针
1)一般指针变量对多维数组的引用:[/size]

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

5. 二维数组中的行地址和列地址
1)int a[3] [2],其结构为:
[img]http://images.cnblogs.com/cnblogs_com/elingwange/389869/r_%e4%ba%8c%e7%bb%b4%e6%95%b0%e7%bb%84a%e7%9a%84%e7%bb%93%e6%9e%84.jpg[/img]
2)[color=blue]a [i][/color](即 [color=blue]*(a+i)[/color] ) 既可以看成是一维数组 a 的下标为 i 的元素,又可以看成是由 [color=blue]a [i] [0], a [i] [1][/color] 两个元素组成的一维整型数组的数组名,代表这个一维数组的首地址,即第一个元素 [color=blue]a [i] [0][/color] 的地址([color=blue]&a[i][0][/color])。
3)[color=blue]a[i]+j[/color](即 [color=blue]*(a+j)+j[/color]) 代表这个数组中下标为 j 的元素的地址,即 [color=blue]&a[i][j][/color]。
4)[color=blue]*(a[i]+j)[/color](即[color=blue]*(*(a+i)+j)[/color])代表这个地址所指向的元素的值,即 [color=blue]a[i][j][/color]。
5)以下四种表示元素 [color=blue]a[i][j][/color] 的形式是等价的:
[/size]

a[i][j]
*(a[i]+j)
*(*(a+1)+j)
(*(a+i))[j]
[size=medium]6)如果将 a 看成一个行地址(第0行的地址),则 a+i 代表 a 的第 i 行的地址,a[i] 可看成一个列地址,即第 i 行第0列的地址。
7)行地址 a 每次加1,表示指向下一行,而列地址 a[i] 每次加一,表示指向下一列。

6. 行指针
1)以二维数组 a 为例,定义行指针p:[/size]

//定义
int (*p)[2]; //指定列数为2

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

p[i][j]
*(p[i]+j)
*(*(p+1)+j)
(*(p+i))[j]

[size=medium]7. 列指针
1)同样以二维数组 a 为例,定义列指针p:[/size]

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;
}
[size=medium]2)此时,可以将 a 看成一个由(3行x2列)个元素组成的一维数组,然后像访问一维数组一样访问 a。
3)对于列指针p, [color=red]p [i] [j][/color] 写法是错误的。

8. 指针数组
1)当某个数组单元都是指针型数据时,这个数组被称为指针数组。
2)定义与赋值:[/size]

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;
}
[size=medium] 2)指针数组和二维数组行指针的区别:
[img]http://images.cnblogs.com/cnblogs_com/elingwange/389869/r_%e6%8c%87%e9%92%88%e6%95%b0%e7%bb%84%e5%92%8c%e4%ba%8c%e7%bb%b4%e6%95%b0%e7%bb%84%e8%a1%8c%e6%8c%87%e9%92%88%e7%9a%84%e5%8c%ba%e5%88%ab.jpg[/img][/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值