指针

来源:互联网 发布:java大牛博客 编辑:程序博客网 时间:2024/06/01 08:33



一.指针的定义


1.定义格式:类型  *指针变量名 (int *a),指针变量只能存储地址

2.指针的作用:能够根据一个地址值,访问对应的存储空间

3.定义的时候同时赋值

int a = 10; // 定义一个整型变量int *p = &a; // 定义一个指针变量并把整型变量的地址赋值给指针变量printf("%d",*p) //取出指针指向的值

4.定义后再赋值

int a = 10;int *p;p = &a; //把地址赋值给指针变量printf("%d",*p)

5.注意

(1)定义指针变量时,*只是代表一个符号标准,一个象征,没有其他特殊含义,只表示后面变量是指针变量。

(2)指针变量需要赋值的时地址,并且是和定义时候类型一样的变量地址。

(3)访问指针变量指向的存储空间:用*指针变量,这个*的作用就是访问地址指向的存储空间,和定义的时候完全不一样。

(4)%p输出指针里面存储的地址值。

(5)类型不能乱用,int型的指针只能指向int型变量的地址。


6.清空指针操作

定义指针变量不赋值,会使指针指向一个不确定的地址。未经初始化的指针变量,不可以拿来简介访问其他存储空间。这时可以把指针清空:指针变量 = 0;或者 指针变量 = NULL;这样指针变量就不指向任何地址,不能再间接访问其他存储空间。


7.指向指针的指针:类型 **变量(第一个*和类型一起表示这个变量指向的是指针类型,第二个*则表示这个变量是指针)


8.任何类型的指针都占用8个字节的存储空间。


9.指针必须要分类型,因为(*指针变量)访问存储空间的时候是根据类型占用的字节访问指向的值的内存,如果赋值了不一样类型的地址,会访问错误内存空间。(%zd:unsigned long)


二.指针与数组


1.指向一维数组的指针:把数组名(数组名就是数组的地址,也是数组首元素的地址)赋值给指向变量,这样指针就拿到数组的地址。

指针变量---->&数组名[0]  (指针指向首元素的地址)

指针变量+1---->&数组名[1] (这里面的+1不是单纯的加1,而是加上元素类型占用的字节数,所以+1其实是下一个元素的地址)

指针变量+i---->&数组名[i] (+i指的的数组第i+1个元素的地址)


2.数组元素的访问方式

int a[5];int *p;p = a; // 指针p指向数组

(1)数组名[下标]:可以访问数组元素

(2)指针变量名[下标]:也可以访问数组元素

(3)*(p+i):p+i是数组第i+1个元素的地址,前面加上*则表示访问指针指向第i+1个元素的值


3.指针变量+1,地址值究竟加多少,取决于指针的类型


三.指针与字符串


1.定义

(1)常量区:存放一些常量字符串(里面的值是不可以修改的)

(2)堆:对象

(3)栈:存放局部变量(里面的值是可以修改的)


2.定义字符串的二种方式

(1)利用数组(存放在栈里)

char a[] = "weijg";

特点:字符串里面的字符是可以修改的

使用场合:字符串的内容需要经常修改

(2)利用指针(存放在常量区)

char *a = "weijg";

特点:字符串其实是一个常量字符串,里面的字符是不可以修改的,用指针指针变量指向相同的字符串,这2个指针是指向相同的地址。

使用场合:字符串的内容不需要修改,而且这个字符串经常使用


四.返回指针的函数


1.指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的

2.返回指针的函数的一般形式为:类型名 * 函数名(参数列表):可以返回如:return "weijg"(返回字符串的地址给这个指针)


五.指向函数的指针


1.为什么指针可以指向一个函数?
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来

存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。


2.指向函数的指针的定义

(1)定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...)

(2)(*指针变量名)是固定写法,代表指针变量p将来肯定是指向函数

(3)int (*p)(int ,int) (这表示指向一个(返回值类型是整型,接收2个整型参数的)函数的指针)


3.指向函数的指针的初始化

(1)函数的返回值类型 (*指针变量名)(形参1, 形参2, ...) = 函数名  (直接定义的时候就赋值一个函数名)

(2)函数的返回值类型 (*指针变量名)(形参1, 形参2, ...) ;指针变量名 = 函数名。(先定义,然后把函数名赋值给这个指针变量)


4.使用注意

由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的

指向函数的指针变量主要有两个用途:

(1)调用函数:(*指针变量名)(实参1, 实参2, ...)  或者  指针变量名(实参1, 实参2, ...)

(2)将函数作为参数在函数间传递

0 0
原创粉丝点击