玩个多级指针

本文介绍了C语言中的多级指针,特别是二级指针的声明和使用。强调了多级指针必须指向变量而非数组名。在传递数组作为函数参数时,实际上是传递了数组的首地址,因此不能通过`sizeof`来获取数组长度。错误示例和正确做法的展示帮助读者理解这一概念。
摘要由CSDN通过智能技术生成
  • 定义:一个指向指针变量指针变量,称为多级指针。
    对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。二级指针变量的说明形式:
    <存储类型> <数据类型> ** <指针名>
    总结:注意加粗的部分,指向指针变量!一定要是变量。如果指向的是数组名(也就是数组的首地址,会报警告,因为数组名是地址常量,后边有例子)。
#include <stdio.h>

int main(int argc, char const *argv[])
{
	
	int m = 100,*p;
	int **q ;

	p = &m;
	q = &p;

	printf("m=%d,&m=%p,p=%p,&p=%p\n", m,&m,p,&p);
	printf("q=%p,&q=%p,*q=%p,**q=%d\n", q,&q,*q,**q);

	return 0;
}

传递数组

当形参是数组形式是,其本质也是一个指针,数组作为实参传递时,形参斌没有复制实参所有的内容,而是复制了实参的首地址。

通过c代码,不利用返回值的形式,利用输出参数的形式,将一个一位数组的和输出

#include <stdio.h>


int sum(int a[],int count)
{
	int n,i=0;
	n = sizeof(a);
	count = 0;
	for(;i<n;i++)
	{
		count += a[i];
	}
}

int main(int argc, char const *argv[])
{
	int a[2]={1,2};
	int count;
	sum(a,count);
	printf("%d\n", count);
	return 0;
}

上述代码是错误示范,下边再来个错误示范,初学者容易的错误。主要是以下几点
1.sum函数的参数,int a[]实际是指针,即 int *a.数组做形参的时候,并不是传递过来整个数组,而是数组的首地址,所以通过sizeof求数组长度是不正确的,此时求的是指针的长度,32位系统中此时为3.64位系统中此时为8.
2.输出参数,要传递指针。因为sum中的count参数和main函数中的count并不是一个count,sum中的count是局部变量,函数结束时候自动销毁,并不会返回给main函数。另外输出参数不要加const。输入参数为指针的时候加const。一般可以通过参数对比是不是输出参数。修改代码如下

#include <stdio.h>

#if 1
int sum(int **a,int *count)
{
	int n,i=0;
	n = sizeof(*a)/sizeof(int);//*a本质还是指针,因为是64位系统所以求出来为2
printf("--1-%d---\n", n);
	*count = 0;
	for(;i<n;i++)
	{
		*count += *(*a+i);
		 //youxianji
		printf("--2-%d---\n",(**a) );
		//printf("--2-%d---\n",*++a );

		//printf("--3-%d---\n", n);

	}
}
#endif
int main(int argc, char const *argv[])
{
	int a[]={1,2,3,1};
	int *q = a;
	int **p = &q;
		
	int count=0;
	sum(p,&count);

	printf("%d\n", count);
	return 0;
}

在这里插入图片描述
本来想偷懒,不想传递数组元素的个数,就想着传递一个二级指针,一级指针取地址,就可以通过指针操作主函数中的数组了,出现了上述代码的错误。
下边演示正确的代码

#include <stdio.h>

#if 1
int sum(int *a,int n,int *count)
{
	int i = 0;
	*count = 0;

	for(;i < n;i++)
	{
		*count += *(a+i);
		//*count += a[i];
	}
}
#endif

int main(int argc, char const *argv[])
{
	int a[]={1,2,3,1};
		
	int count=0;

	sum(a,4,&count);

	printf("%d\n", count);
	return 0;
}

总结:数组做形参,一定要传递数组元素的个数。因为形参实际是一维指针
1、不能在[]给定大小

2、不要在被调用函数里使用sizeof(a)/sizeof(a[0])形式传递数组大小,直接给出数组长度,或者在 主调函数中使用sizeof(a)/sizeof(a[0])传递长度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值