首页 > 技术文章 > C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针

storml 2017-11-01 15:17 原文

指针是一个变量,其值为另一个变量的地址。

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。

下面从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 }

 

推荐阅读