指针与数组(一)——指针认知

来源:互联网 发布:php网站源码与asp.net 编辑:程序博客网 时间:2024/05/22 09:00

一.定义与初始化

1.       如何理解指针?

1)        指针是变量。

2)        指针是一个地址,指向的是个类型。

3)        指针指向的是地址,地址指向的是内容。

4)        指针的指针,是面对于指针的变量。

5)        指针类型的字节长度由操作系统决定(32位操作系统为4字节,64位操作系统为8字节)

2.      定义指针的几种规范
int  *p;  //重在表示 *a 是 int型的。
int*  p;  //重在表示 int* 是一个类型(复核类型),它是指向 int 的指针。

二.*与&运算符详解

*是取指针目标运算符  其后跟随的必须是指针类变量

&是取地址运算,对任意变量都可以进行取地址操作

1.       指针的类型和指针所指向的类型

指针类型:

1)        int  *ptr; //指针的类型是int*

2)        char  *ptr; //指针的类型是char*

3)        int  **ptr; //指针的类型是int**

4)        int  (*ptr)[3]; //指针的类型是int(*)[3]

5)        int  *(*ptr)[4]; //指针的类型是int*(*)[4]

指针所指向的类型:

1)        int  *ptr; //指针所指向的类型是int

2)        char  *ptr; //指针所指向的类型是char

3)        int  **ptr; //指针所指向的类型是int*

4)        int  (*ptr)[3]; //指针所指向的类型是int()[3]

5)        int  *(*ptr)[4]; //指针所指向的类型是int*()[4]

2.       指针的值


p = &num = *pp = **ppp

*p = num = **pp = ***ppp = *(&num)

(*p)++:对p指向的内存空间进行操作(加1)à5 + 1 = 6

p++:对p对应的内存空间加1(步长)à0x1000 + 4(步长) = 0x1004

num++:对num对应的内存空间加1à5 + 1 = 6

一维指针保存基本变量的地址

二维指针保存一维指针的地址

三维指针保存二维指针的地址

远指针:超过二维的指针。

三.指针的运算

1.       指针的赋值运算

空指针:不允许操作,不允许访问。NULL为(void *)0的宏定义

野指针:(详情见野指针及野指针的避免)

指针的算术运算:

不同指针类型赋值导致的问题:因为指针的类型不同,代表指针的运算方式也不一样,所以运算后所指向的地址不一样。

à警告:从不兼容的指针类型赋值(检查步长)

长步长赋值给短步长:数据不完整

短步长赋值给长步长:数据可能越界

void *——万能指针:可指向任意类型的指针,但不能取值。

2.       指针的算术运算

指针+整数:加步长

指针-指针:两指针相隔的数据个数。

char  *ptr = “hello world”;

char  *str = ptr + sizeof(ptr);àstr – ptr = 11

int a[10] = {1,2,3,4,5,6,7,8,9,10};à&a[9]- &a[0] = 9


0 0