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]。