指针

指针

一. 指针的概念

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。(而通过解引用可以访问该地址内存里面的数据)

二. 如何理解指针

要理解指针就要搞清楚指针的四个方面
1.指针的类型
(1)int*ptr; //指针的类型是int*
(2)char*ptr; //指针的类型是char*
(3)int**ptr; //指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int( *)[3]

2.指针指向的类型
(1)int*ptr; //指针的类型是int
(2)char*ptr; //指针的类型是char
(3)int**ptr; //指针的类型是int*
(4)int(*ptr)[3]; //指针的类型是int()[3]

3.指针的值及指针所指向的区域
指针的值是指针本身存储的数值,这个值将被编译器当作一地址,而不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

4.指针本身占据的内存区
指针占据的内存:指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32 位平台里,指针本身占据了4 个字节的长度。

三. 指针的间接访问

通过指针访问它所指向的地址的过程叫做间接访问或解引用。
int a =10;
int *d = &a; //假定地址a的值为100
此时,当我们对d进行间接访问时(d实际保存的是a的地址及&a的内容),它表示访问位置为100的内容,并查看那里的值。则*d的值即为10.

四. 指针的初始化

int *a;
*a = 12;
这是一个极为常见的错误,对于后面那句a = 12,简直是不知所云。a是一个指针,它并没有被初始化让它指向哪里,而你让它所指向的内容为12。我们根本没有办法预测12会被存放到哪里,因此这个错误很明显。

五. NULL指针

有一个特殊指针,表示不指向任何东西。要使一个指针为NULL,可以给他赋值一个零值。这个指针是非常有用的,他给出了一种方法,表示某个特定指针目前并未指向任何东西。需要注意的是,这个指针并未指向任何东西,因此给它解引用是非法的。因此在解引用之前应该先检查指针并非是空指针。

六. 对指针的操作

1.指针 +/- 整数
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位。
char a[20];
int ptr=(int )a; //强制类型转换并不会改变a 的类型
ptr++;
在上例中,指针ptr 的类型是int*,它指向的类型是int,它被初始化
为指向整型变量a。接下来的第3 句中,指针ptr 被加了1,编译器是这样处理的:它把指针ptr 的值加上了sizeof(int),在32 位程序中,是被加上了4,因为在32 位程序中,int 占4 个字节。由于地址是用字节做单位的,故ptr 所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节。由于char 类型的长度是一个字节,所以,原来ptr 是指向数组a 的第0 号单元开始的四个字节,此时指向了数组a 中从第4 号单元开始的四个字节。
对指针的加减法会使指针指向下一个或者上一个元素,然而如果对指针操作后,指针所指的位置位于数组第一个元素前面或者数组最后一个元素后面,那么结果是未定义的。令人奇怪的是,让指针指向数组最后一个元素后面那个位置是合法的,但对这个指针进行间接访问可能会失败。一般不允许对这个位置进行操作。

2.指针 - 指针
只有当两个指针指向同一个数组元素时 ,才允许一个指针减去另一个指针。结果会是下标相减的结果,与类型无关。

七. 指针表达式

一个表达式的结果如果是一个指针,那么这个表达式就叫指针表式。
下面是一些指针表达式的例子:
int a,b;
int array[10];
int *pa;
pa=&a; //&a 是一个指针表达式。
Int **ptr=&pa; //&pa 也是一个指针表达式。
*ptr=&b; //*ptr 和&b 都是指针表达式。
pa=array;
pa++; //这也是指针表达式。

八. 指针关系

1.指针与函数
可以把一个指针声明成为一个指向函数的指针。
int fun1(char *,int);
int (pfun1)(char ,int);
pfun1=fun1;
int a=(*pfun1)(“abcdefg”,7); //通过函数指针调用函数。
可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来
作为实参。

2.指针与结构体
struct MyStruct
{
int a;
int b;
int c;
};
struct MyStruct ss={20,30,40};
//声明了结构对象ss,并把ss 的成员初始化为20,30 和40。
struct MyStruct *ptr=&ss;
//声明了一个指向结构对象ss 的指针。它的类型是MyStruct *,它指向的类型是MyStruct。
请问怎样通过指针ptr 来访问ss 的三个成员变量?
ptr->a; //指向运算符,或者可以这们(*ptr).a,建议使用前者
ptr->b;
ptr->c;

3.指针与数组
这个和数组一块说

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值