1.二级指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 10;
int* pa = &a;//pa就是一级指针变量
int** ppa = &pa;//ppa就是二级指针变量
**ppa = 20;
printf("%d\n,a");
return 0;
}
a的值是4,a的地址是0x009efadc,
pa为指针变量,pa存的是a的地址0x009efadc,因此可以通过pa来找到a的值,或者修改a的值。 * 为解引用操作符,int* pa表示pa为指针。
ppa为二级指针,ppa存的是pa的地址,int** ppa中右边的*说明ppa是指针,而int*是说明ppa指向的对象是int*类型。二级指针是用来存放一级指针变量的地址的。
名称 | 值 | 类型 |
a | 10 | int |
&a | 0x012ffcf8 | int |
pa |
0x012ffcf8 | int* |
&pa | 0x012ffcec | int* |
ppa | 0x012ffcec | int** |
# '&'为取地址操作符。
2.指针函数
普通我们使用的数组:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
//1 2 3 4
//2 3 4 5
//3 4 5 6
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
指针数组:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
int* pa = &a;
int* pb = &b;
int* pc = &c;
int* parr[10] = { &a,&b,&c };//parr就是用来存放指针的指针数组
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d ", *(parr[i]));
}
}
int* parr就是我们的指针数组,我们在parr中存放a,b,c的地址。
parr中的元素包括&a,&b,&c.
&a指向的对象为a。
&b指向的对象为b。
&c指向的对象为c。
接下来是我们的拓展内容:
我们可以通过指针函数去合并不同的数组
我们知道,parr中存放的元素是arr1,arr2,arr3,而传输过去的arr1为首元素的地址,因此parr为int*类型,用来存放地址。
使用arr1的话,我们会:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0;
int arr[] = {1,2,3,4,5,6,7,8,9,0};
for (i = 0; i <= 9; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
已知arr1,arr2,arr3被我们存放到parr中,我们应该如何去使用数组呢?
由于arr[i]-->*(arr+i),想要打印出arr1,arr2,arr3的内容,我们只需要通过for循环parr[i][j]就可以:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr1[4] = { 1,2,3,4 };
int arr2[4] = { 2,3,4,5 };
int arr3[4] = { 3,4,5,6 };
int* parr[3] = { arr1,arr2,arr3 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}
parr[i]表示的是parr的元素及arr1,arr2,arr3,parr[i][j]在这个基础上可视为arr1[j],arr2[j],arr3[j]。