目录
1.一级指针
一级指针--用于存放元素(整型、字符型···)地址。
如:int* p: 整型指针--指向整型的指针
char* pc:字符指针--指向字符的指针
void* pv:无类型的指针
2.二级指针
二级指针--用于存放一级指针的地址
int main()
{
int a = 10;
int *pa = &a;//pa是指针变量,一级指针
//*pa表示pa是一个指针变量,int表示pa指向的a的类型为整型变量(int)
int* *ppa = &pa;//pa也是个变量,&pa取出pa在内存中的起始地址,ppa是二级指针变量
//*ppa表示ppa是一个指针变量,int*表示ppa指向的pa的类型为整型指针变量(int*)
}
图解:
延伸:三级指针--用于存放二级指针的地址
如:int*** pppa = &ppa;//三级指针
3.数组参数
(1)一维数组传参
下列形式全部可行!!!
void test(int arr[]){}//数组大小可以省略
void test(int arr[10]){}//数组传参,数组接收
void test(int *arr){}//数组传参,整型指针接收
void test2(int* arr[]) {}//数组大小可以省略
void test2(int *arr[20]){}
void test2(int **arr){}//一级指针的地址用二级指针存储(接收)
int main()
{
int arr[10] = { 0 };
int* arr2[20] = { 0 };//存放int*的数组
test(arr);
test2(arr2);//arr2表示数组首元素的地址,即第一个int*的地址
}
(2)二维数组传参
下列形式是否可行?yes or no
void test(int arr[3][5]){}//yes
void test(int arr[][]){}//no
void test(int arr[][5]){}//yes
//总结:二维数组传参,函数形参的设计只能省略第一个[]的数字;因为对一个二维数组,可以不知道有多少行,但必须知道一行有都少个元素;这样才方便运算。
void test(int *arr){}//no
void test(int *arr[5]){}//no
void test(int (*arr)[5]){}//yes,指向一维数组的指针
void test(int **arr){}//no
int main()
{
int arr[3][5] = { 0 };
test(arr);//首元素地址,即第一行的地址,一维数组的地址
}
4.指针参数
(1)一级指针传参
①一级指针传参,打印数组内容
void print(int* p, int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
print(p, sz);//一级指针p传给函数
return 0;
}//输出1 2 3 4 5 6 7 8 9 10
②当函数的参数部分为一级指针时,函数能接收什么参数?
void test(char* p)
{
···
}
int main()
{
//method1传变量地址
char ch = 'w';
test(&ch);//取地址后,类型为char*
//method2把一级指针传参
char ch = 'w';
char* p1 = &ch;
test(p1);//指针变量传参,指针变量接收
return 0;
}
(2)二级指针传参
①把二级指针传参,用于更改变量值
#include<stdio.h>
void test(int** p2)
{
**p2 = 20;
}
int main()
{
int a = 10;
int* pa = &a;//pa是一级指针
int** ppa = &pa;//ppa是二级指针
test(ppa);
printf("%d\n", a);//输出20
return 0;
}
②当函数的参数为二级指针的时候,可以接收什么参数?
void test2(int** p1)
{
···
}
int main()
{
int a = 10;
int* pa = &a;//pa是一级指针
int** ppa = &pa;//ppa是二级指针
//method1把二级指针传参
test(ppa);
//method2传一级指针变量的地址
test(&pa);
//method3传存放一级指针的数组(名)
int* arr[10] = { 0 };
test(arr);
return 0;
}