zoukankan      html  css  js  c++  java
  • 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
    ", p); //[p] = 0x7ffeeeb03b5c
     28     // 直接使用指针[*p]访问变量a的值(即表示此指针指向的内存地址中存放的内容)
     29     printf("[*p] = %d
    ", *p); //[*p] = 10
     30     // 指针p同时也是个变量,要为其分配内存地址,而[&p]就表示编译器为变量p分配的内存地址
     31     printf("[&p] = %p
    ", &p); //[&p] = 0x7ffeeeb03b50
     32     printf("--------------------------
    ");
     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:	arr1[%d] = %p
    ", i, parr1);
     42         printf("Value:	arr1[%d] = %d
    ", 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("--------------------------
    ");
     54     // long类型指向上一个整数位置后,当前位置往前移8个字节。
     55     long arr2[] = { 70, 80, 90 };
     56     long *parr2 = &arr2[2];
     57     for (j = 3; j > 0; j--) {
     58         printf("Address:	arr2[%d] = %p
    ", j, parr2);
     59         printf("Value:	arr2[%d] = %d
    ", 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("--------------------------
    ");
     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	%d	%d
    ", *p1[0], *p1[1], *p1[2]); // 100     200     300
     85     printf("%d	%d	%d
    ", (*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;
    ", var, *ptr, **pptr); // var = 1000; *ptr = 1000; **pptr = 1000;
     97     // &var = ptr
     98     printf("&var = %p; ptr = %p;
    ", &var, ptr); // &var = 0x7ffeeeb03b44; ptr = 0x7ffeeeb03b44;
     99     // &ptr = pptr
    100     printf("&ptr = %p; pptr = %p;
    ", &ptr, pptr); // &ptr = 0x7ffeeeb03b38; pptr = 0x7ffeeeb03b38;
    101 }
  • 相关阅读:
    Markdown
    异异还原
    程序和算法
    运算符
    Java复习1
    复习总结
    为什么Byte是8位,但是却只能表示到127,而不是255?
    笔记的认识
    笔记本触摸板
    电脑热键
  • 原文地址:https://www.cnblogs.com/storml/p/7766645.html
Copyright © 2011-2022 走看看