C指针简单理解使用

1、指针是什么:
指针可以说是C语言的灵魂,存放内存地址的变量,可以访问内存中的数据。根据C语言中定义用(类型名 * 指针 名)表示一个指针变量,至于有多少个*号那要看指针存放的是什么类型变量的地址(&变量名),这样就衍生了多级指针,通过定义一个指针类型的指针存放指针的地址。可能这句话有点绕,但是在C语言(强类型语言)中变量存放的数据需要相同,否者需要进行类型强转。但是对于多级指针来说,强制类型转换然并卵,因为对于变量来说只有符合类型的变量可以通过运算符操作,若一级指针强制转换为二级指针这是不成立的,二级指针存放的是指针的地址,一级指针是其他类型的变量的地址。

2、简单理解指针使用:
很多时候操作一串数据的时候,用数组与指针的配合操作是比较方便的,一般情况下定义一个数组,其数组名可以认为就是指向该数组首地址的指针(语法上允许)。话不多说,使用伪代码来辅助理解:

#include 
int main(void)
{
	int * p = 0;         //定义了一个指针变量 
	int array[10] = {0,1,2,3,4,5,6,7,8,9};   //10个元素的数组   array 是首地址
	
	p = &array[0];       //指针指向数组 也可以写成 p = array (语法上允许) 
	
	//把数组值打印方便看
	int i,j;
	for(i=0;i<10;i++)
	{
		printf("array[%d] = %d\t",i,p[i]);    //指针数组转换使用 
	 } 
	printf("\n"); //换行 
	
	for(j=0;j<10;j++)
	{
		printf("array[%d] = %d\t",j,array[j]);    //指针数组转换使用 
	 }
	printf("\n"); //换行 
	printf("\n"); //换行 
	
	printf("数组首地址 &array[0] :%p\n",&array[0]); //打印地址使用%p (语法)
	printf("定义的指针地址 p :    %p\n",p); 
	printf("\n"); //换行 
	
	//接下来是指针操作数组
	printf("指针+1相当于数组下标+1的元素 p(x)+1:     %p\n",p+1);         //没有解(*)引用的时候是操作指针的值,解引用是操作指针指向内存的值 
	printf("指针+1相当于数组下标+1的元素 array[x+1] :%p\n",&array[1]); 
	printf("\n"); //换行 
	
	printf("指针+1解引用相当于数组下标+1的元素的值*(p+1):     %d\n",*(p+1));   //没有+1的情况是*p,指向谁就是谁的值 
	printf("指针+1解引用相当于数组下标+1的元素的值:array[1]   %d\n",array[1]); //刚开始指向的是 array[0]=0,下标+1所以是 array[1]=1
	
	printf("\n"); //换行 
	printf("指针+1解引用后相当于数组下标+1的元素的值,如果进行运算操作就是元素值得运算:  *p+1      %d\n",*p+1); 
	printf("指针+1解引用后相当于数组下标+1的元素的值,如果进行运算操作就是元素值得运算:array[0]+1  %d\n",array[0]+1);
	 
	return 0;
}      

执行结果:

C指针简单理解使用_第1张图片

指针±n(正整数)是指向前向后移动n个单元返回的是该地址,指针之间的±是指两个指针在内存段中相差多少个单元。

3、关于多级指针:
可能由于阅历不够,目前还未真正使用过二级指针及以上,也可以说目前做的业务上并没有这方面的需求。一般情况下也是由于需要操作指针的值才需要定义二级指针,就像我们封装一个函数接口去操作某段内存中的数据时,需要将数据的首地址作为参数传入函数进行操作,同样道理当需要改变某个指针指向的内存地址值,除了可以用赋值运算符但是我目前了解到的一个场景是Linux内核中哈希表,为了高效使用二级指针指向前驱节点的NEXT,这样就可以在删除和插入的时候很方便操作节点。
对于二级指针的操作与理解,将在Linux内核哈希表详细解读。

你可能感兴趣的:(分享)