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