玩个多级指针

  • 定义:一个指向指针变量指针变量,称为多级指针。
    对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。二级指针变量的说明形式:
    <存储类型> <数据类型> ** <指针名>
    总结:注意加粗的部分,指向指针变量!一定要是变量。如果指向的是数组名(也就是数组的首地址,会报警告,因为数组名是地址常量,后边有例子)。
#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])传递长度

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读