1 多级指针
void t9(){
int num = 999 ;
int * num_p = #
int ** num_p_p = & num_p;
int *** num_ppp = & num_p_p;
printf("num_p 的值 is %d\n",* num_p);
printf("num_p_p 的值 is %d\n",** num_p_p);
printf("num_ppp 的值 is %d\n",*** num_ppp);
printf("num_ppp 的值是一个内存地址 %p = num_p_p 的地址 %p \n",num_ppp ,&num_p_p);
printf("num_p_p 的值是一个内存地址 %p = num_p 的地址 %p \n",num_p_p ,&num_p);
printf("num_p 的值是一个内存地址 %p = num 的地址 %p \n",num_p ,&num);
printf("\n------------------------------------------------\n");
printf("* num_ppp 的意思是获取他的指向的值 因为 num_ppp 的值是 &num_p_p 所以\n"
" * num_ppp = *(& num_p_p) = num_p_p = & num_p 的 内存地址 "
"所以\n "
"%p = %p =%p =%p \n",* num_ppp ,*(& num_p_p),num_p_p,& num_p);
printf("\n------------------------------------------------\n");
printf("\n------------------------------------------------\n");
printf("** num_ppp 的意思是获取他的 指向 的值 的 指向 的值 \n"
" ** num_ppp = **(& num_p_p) = *num_p_p = *(& num_p) = num_p = &num "
"所以\n "
"%p = %p =%p = %p = %p = %p\n",** num_ppp ,**(& num_p_p),*num_p_p,*(& num_p),num_p,&num);
printf("\n------------------------------------------------\n");
printf("\n------------------------------------------------\n");
printf("*** num_ppp 的意思是获取他的 指向的值 的 指向的值 的 指向的值 \n"
" *** num_ppp = ***(& num_p_p) = **num_p_p = **(& num_p) = *num_p = *(&num) = num = 999 "
"所以\n "
"%p = %p =%p = %p = %p = %p= %p= %d\n",*** num_ppp ,***(& num_p_p),**num_p_p,**(& num_p),*num_p,*(&num),num,num);
printf("\n------------------------------------------------\n");
printf("\n------------------------------------------------\n");
printf("*** num_ppp 的意思是获取他的 指向的值 的 指向的值 的 指向的值 \n"
" *** num_ppp = ***(& num_p_p) = **num_p_p = **(& num_p) = *num_p = *(&num) = num = 999 "
"所以\n "
"%d = %d =%d = %d = %d = %d= %d= %d\n",*** num_ppp ,***(& num_p_p),**num_p_p,**(& num_p),*num_p,*(&num),num,num);
printf("\n------------------------------------------------\n");
}
返回结果
E:\C\Project\C01\cmake-build-debug\C01.exe
num_p 的值 is 999
num_p_p 的值 is 999
num_ppp 的值 is 999
num_ppp 的值是一个内存地址 000000000064FDC0 = num_p_p 的地址 000000000064FDC0
num_p_p 的值是一个内存地址 000000000064FDC8 = num_p 的地址 000000000064FDC8
num_p 的值是一个内存地址 000000000064FDD4 = num 的地址 000000000064FDD4
------------------------------------------------
* num_ppp 的意思是获取他的指向的值 因为 num_ppp 的值是 &num_p_p 所以
* num_ppp = *(& num_p_p) = num_p_p = & num_p 的 内存地址 所以
000000000064FDC8 = 000000000064FDC8 =000000000064FDC8 =000000000064FDC8
------------------------------------------------
------------------------------------------------
** num_ppp 的意思是获取他的 指向 的值 的 指向 的值
** num_ppp = **(& num_p_p) = *num_p_p = *(& num_p) = num_p = &num 所以
000000000064FDD4 = 000000000064FDD4 =000000000064FDD4 = 000000000064FDD4 = 000000000064FDD4 = 000000000064FDD4
------------------------------------------------
------------------------------------------------
*** num_ppp 的意思是获取他的 指向 的值 的 指向 的值 的 指向 的值
*** num_ppp = ***(& num_p_p) = **num_p_p = **(& num_p) = *num_p = *(&num) = num = 999 所以
00000000000003E7 = 00000000000003E7 =00000000000003E7 = 00000000000003E7 = 00000000000003E7 = 00000000000003E7= 0000000
0000003E7= 999
------------------------------------------------
------------------------------------------------
*** num_ppp 的意思是获取他的 指向 的值 的 指向 的值 的 指向 的值
*** num_ppp = ***(& num_p_p) = **num_p_p = **(& num_p) = *num_p = *(&num) = num = 999 所以
999 = 999 =999 = 999 = 999 = 999= 999= 999
------------------------------------------------
Process finished with exit code 0
2 数组与数组指针,.采用指针遍历数组。
void t10(){
int arr[] = {113,2,23,9} ;
int i = 0 ;
for (i; i < 4; ++i) {
printf("arr[%d] = %d\n",i,arr[i]);
}
int * arr_p = arr ;
int j = 0 ;
for (j; j < 4; ++j) {
printf("arr[%d] = %d\n",j,*(arr_p +j));
}
printf("arr %p\n",arr);
printf("&arr %p\n",&arr);
printf("&arr[0] %p\n",&arr[0]);
printf("数组 arr 的值 获取的是数组中第一位的地址值\n");
printf("数组 arr 的值 就是一个地址值 所有 和 &arr 相等\n");
printf("所以 arr = &arr = &arr[0]\n");
printf("int * arr_p = arr ; 所以 可以通过arr_p 获取到 数组的值\n");
printf("* arr_p = %d = arr[0] = %d\n",*arr_p,arr[0]);
printf("* (arr_p+1) = %d = arr[1] = %d\n",*(arr_p+1),arr[1]);
printf("* (arr_p+2) = %d = arr[2] = %d\n",*(arr_p+2),arr[2]);
printf("* (arr_p+3) = %d = arr[3] = %d\n",*(arr_p+3),arr[3]);
printf("如果 arr_p+=1 后 这每次 都只需在加一即可\n");
printf("* arr_p = %d = arr[0] = %d\n",*arr_p,arr[0]);
printf("* (arr_p+=1) = %d = arr[1] = %d\n",*(arr_p+=1),arr[1]);
printf("* (arr_p+=1) = %d = arr[2] = %d\n",*(arr_p+=1),arr[2]);
printf("* (arr_p+=1) = %d = arr[3] = %d\n",*(arr_p+=1),arr[3]);
printf("* (arr_p-=3) = %d = arr[0] = %d\n",*(arr_p-=3),arr[0]);
}
返回结果
E:\C\Project\C01\cmake-build-debug\C01.exe
arr[0] = 113
arr[1] = 2
arr[2] = 23
arr[3] = 9
arr[0] = 113
arr[1] = 2
arr[2] = 23
arr[3] = 9
arr 000000000064FDD0
&arr 000000000064FDD0
&arr[0] 000000000064FDD0
数组 arr 的值 获取的是数组中第一位的地址值
数组 arr 的值 就是一个地址值 所有 和 &arr 相等
所以 arr = &arr = &arr[0]
int * arr_p = arr ; 所以 可以通过arr_p 获取到 数组的值
* arr_p = 113 = arr[0] = 113
* (arr_p+1) = 2 = arr[1] = 2
* (arr_p+2) = 23 = arr[2] = 23
* (arr_p+3) = 9 = arr[3] = 9
如果 arr_p+=1 后 这每次 都只需在加一即可
* arr_p = 113 = arr[0] = 113
* (arr_p+=1) = 2 = arr[1] = 2
* (arr_p+=1) = 23 = arr[2] = 23
* (arr_p+=1) = 9 = arr[3] = 9
* (arr_p-=3) = 113 = arr[0] = 113
Process finished with exit code 0
3 循环时给数组赋值。 数组指针操作的两种方式。
void t11(){
int arr[5];
int i = 0 ;
// (sizeof arr = 4*5 = 20) / (sizeof (int) = 4) = 5
for (i = 0; i < sizeof arr / sizeof (int); ++i) {
arr[i] = 1000+i ;
printf("arr[%d] = %d\n",i,arr[i]);
}
int arrs[5];
int * arrs_p = arrs ;
int j = 0 ;
for (j; j < sizeof arrs / sizeof (int); ++j) {
* (arrs_p+j) = 1000+j ;
printf("arrs[%d] = %d\n",j,arrs[j]);
}
}
返回结果
E:\C\Project\C01\cmake-build-debug\C01.exe
arr[0] = 1000
arr[1] = 1001
arr[2] = 1002
arr[3] = 1003
arr[4] = 1004
arrs[0] = 1000
arrs[1] = 1001
arrs[2] = 1002
arrs[3] = 1003
arrs[4] = 1004
Process finished with exit code 0
4 函数指针
void add(int num1 , int num2){
printf("num1 + num2 = %d\n",(num1+num2));
}
void mins(int num1 , int num2){
printf("num1 - num2 = %d\n",(num1-num2));
}
// 操作 回调到 add mins
// void(*method)(int,int) 声明好 函数指针
// void 返回值
// (*method) 函数名
// (int,int) 两个参数
void opreate12(void(*method)(int,int),int num1,int num2){
(*method)(num1,num2);
printf("opreate函数的 method指针是多少:%p\n", method);
}
调用
opreate12(add,100,20);
opreate12(mins,100,20);
// 原理是什么?
printf("main函数的 add指针是多少:%p\n", add);
printf("main函数的 mins指针是多少:%p\n", mins);
// &add和add是一样的值吗
printf("add 的地址 = %p, &add 的地址 = %p\n", add, &add); // 一样的
返回结果
E:\C\Project\C01\cmake-build-debug\C01.exe
num1 + num2 = 120
opreate函数的 method指针是多少:0000000000401F2D
num1 - num2 = 80
opreate函数的 method指针是多少:0000000000401F58
main函数的 add指针是多少:0000000000401F2D
main函数的 mins指针是多少:0000000000401F58
add 的地址 = 0000000000401F2D, &add 的地址 = 0000000000401F2D
Process finished with exit code 0