C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针
指针是一个变量,其值为另一个变量的地址。
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。
下面从4个代码例子分别讲述以下4个知识点:
(1) 指针概念
(2) 数组中指针的递增/递减
(3) 指针数组&数组指针
(4) 指向指针的指针
1 #include <stdio.h> 2 3 // (1)指针概念 4 void example1(); 5 // (2)数组中指针的递增/递减 6 void example2(); 7 // (3)指针数组&数组指针 8 void example3(); 9 // (4)指向指针的指针 10 void example4(); 11 12 int main() { 13 example1(); 14 example2(); 15 example3(); 16 example4(); 17 return 0; 18 } 19 void example1() { 20 // &: 取地址运算符,&a即为a的地址 21 // *: 指针运算符(取内容运算符),*p即为p所指向的变量 22 int a = 10; 23 int *p; 24 p = &a; // [or] *p = a; 25 // [或直接写成] int *p = &a; [不能写成] *p = &a;/int *p = a; 26 // 指针变量*p的值[p]为变量a的地址 27 printf("[p] = %p\n", p); //[p] = 0x7ffeeeb03b5c 28 // 直接使用指针[*p]访问变量a的值(即表示此指针指向的内存地址中存放的内容) 29 printf("[*p] = %d\n", *p); //[*p] = 10 30 // 指针p同时也是个变量,要为其分配内存地址,而[&p]就表示编译器为变量p分配的内存地址 31 printf("[&p] = %p\n", &p); //[&p] = 0x7ffeeeb03b50 32 printf("--------------------------\n"); 33 } 34 void example2() { 35 int i, j; 36 // int类型指向下一个整数位置后,当前位置往后移4个字节。 37 int arr1[] = { 10, 20, 30 }; 38 int *parr1 = arr1; 39 // [or] int *parr1 = &arr1[0]; 40 for (i = 0; i < 3; i++) { 41 printf("Address:\tarr1[%d] = %p\n", i, parr1); 42 printf("Value:\tarr1[%d] = %d\n", i, *parr1); 43 parr1++; 44 } 45 /* output 46 Address: arr1[0] = 0x7ffeeeb03b30 47 Value: arr1[0] = 10 48 Address: arr1[1] = 0x7ffeeeb03b34 49 Value: arr1[1] = 20 50 Address: arr1[2] = 0x7ffeeeb03b38 51 Value: arr1[2] = 30 52 */ 53 printf("--------------------------\n"); 54 // long类型指向上一个整数位置后,当前位置往前移8个字节。 55 long arr2[] = { 70, 80, 90 }; 56 long *parr2 = &arr2[2]; 57 for (j = 3; j > 0; j--) { 58 printf("Address:\tarr2[%d] = %p\n", j, parr2); 59 printf("Value:\tarr2[%d] = %d\n", j, *parr2); 60 parr2--; 61 } 62 /* output 63 Address: arr2[3] = 0x7ffeeeb03b20 64 Value: arr2[3] = 90 65 Address: arr2[2] = 0x7ffeeeb03b18 66 Value: arr2[2] = 80 67 Address: arr2[1] = 0x7ffeeeb03b10 68 Value: arr2[1] = 70 69 */ 70 printf("--------------------------\n"); 71 } 72 void example3() { 73 int i; 74 // 指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针 75 // 数组指针:a pointer to an array,即指向数组的指针 76 int arr[] = { 100, 200, 300 }; 77 //指针数组的赋值 78 int *p1[3]; 79 for (i = 0; i < 3; i++) { 80 p1[i] = &arr[i]; 81 } 82 //数组指针的赋值 83 int (*p2)[3] = &arr; 84 printf("%d\t%d\t%d\n", *p1[0], *p1[1], *p1[2]); // 100 200 300 85 printf("%d\t%d\t%d\n", (*p2)[0], (*p2)[1], (*p2)[2]); // 100 200 300 86 } 87 void example4() { 88 int var = 1000; 89 int *ptr; 90 int **pptr; 91 // 获取var的地址 92 ptr = &var; 93 // 获取ptr的地址 94 pptr = &ptr; 95 // var = *ptr = **pptr 96 printf("var = %d; *ptr = %d; **pptr = %d;\n", var, *ptr, **pptr); // var = 1000; *ptr = 1000; **pptr = 1000; 97 // &var = ptr 98 printf("&var = %p; ptr = %p;\n", &var, ptr); // &var = 0x7ffeeeb03b44; ptr = 0x7ffeeeb03b44; 99 // &ptr = pptr 100 printf("&ptr = %p; pptr = %p;\n", &ptr, pptr); // &ptr = 0x7ffeeeb03b38; pptr = 0x7ffeeeb03b38; 101 }