> 文章列表 > 理解c语言中的指针

理解c语言中的指针

理解c语言中的指针

1.一级指针

1.1指针是什么??

指针就是地址,是一种存储地址的数据类型

int * p 定义了一个变量名为p的指针变量。
int * 是指针的数据类型。
int 是指针变量p指向的数据类型* 说明该变量是一个指针变量。
*p 可以访问指针指向的内容指针的赋值,本质是改变指针的指向,即它储存的地址
int * P = NULL;//要初始化,避免变成野指针
p = &a;
p = &b;
//a b 必须都是int类型, 
//即和定义指针时,指针指向的数据类型相同

1.2经典应用

值交换函数,如果传入的参数是变量本身,那么调用函数会发现,变量值并未改变。

为啥?

因为函数与函数之间的空间是相互独立的,传入实参时,只是复制了它的值,实参本身并不会受到影响。

int swap ( int a, int b )
无法实现两个值改变
int swap ( int *a, int *b ){int temp = *a;*a = *b;*b = temp;
}
可以实现
传入的地址常量并未改变
但地址中的内容改变了
从而实现值交换的功能

2.二级指针

啥又是二级指针??

其实很简单,就是指向指针的指针,即存储一个指针地址的数据类型。

计算机中,任何内容都会有一片空间来存储,这片空间的地址,被一种数据类型存储了,这种数据类型就是指针。

而存储地址的空间也有地址,存储这个地址的数据类型,就是二级指针。

int * * p表示一个指向存储地址的一片空间的地址
int ** 是变量p的数据类型
int *是其指向的数据类型,指向了一个指针明确指针指向的数据类型有啥用?
*p时知道访问多大的空间,如:int *p
*p 时访问四个字节char *p
*p时访问1个字节short *p
*p时访问2个字节int **p, char** p, short **p .........
*p 都是访问4个字节(32位OS)

3.指针的运算

加减N个指针指向的数据类型
指针指向的数据类型就是:去掉一个*和变量名
数组名是指针常量,不能++、–,但可以和其他数字加减。

4.指针和数组的关系

4.1指针和一维数组关系

int * p = NULL;
int a[10] = {0};
p = a;
p = &a[0];

一个指针存储的是地址
数组名表示:①首元素的地址;②整个数组;
所以以上两种对指针p的赋值是等价的。
此时,访问数组有多种方法

a[i]   //a表示整个数组
*(a+i) //a表示首元素的地址
p[i]   //a赋值给p后,p与a含义相同,区别在于变量和常量
*(p+i) //首元素地址
*(p++) //作为变量,可以自加

4.2 指针与二维数组的关系

int a[2][3]  = {0};
定义了一个二维数组,
本质是一维数组,只是它的两个元素又是一维数组a表示:①整个二维数组;②第一个一维数组的地址;
a指向a[0](3个int),即a是一个指向数组的指针a[0]表示:①整个a[0][] 数组;②a[0][0]的地址;
a[0]指向a[0][0],即a[0]是一个指向int的指针。

a的数据类型(去掉变量名a):int (*)[3]
指向的数据类型:int [3],
—a+1会指向下一个元素,即下一个一维数组a[1][ ] 。

a[0]的数据类型:int *
指向的数据类型:int a,a+1指向下一个int。