zoukankan      html  css  js  c++  java
  • C++学习(十九)(C语言部分)之 指针3


    复习
    1、一级指针
    int*p 指向int的指针
    赋值 int x;
    p=&x;//
    *p=2;
    指针指向的谁 解引用之后就是谁
    2、内存四区
    堆区 需要自己手动申请内存 自己释放 (malloc free realloc(内存重新分配) alloc(比malloc多了一个赋值默认值的操作))
    内存大
    栈区 函数定义的变量 在栈区 系统会自动申请 回收内存 系统管理的内存很少
    全局常量 全局(函数在外面) 静态 static int x=1 char*p="hello" (常量区的数据不能修改)
    代码区
    3、动态数组
    int arr[10];
    动态数组 在堆区的数组
    int *p;
    p=(int*)malloc(sizeof(int)*10);//在堆区申请一块内存当做数组使用
    //p[0] p[1] p[2]
    //*(p+0) *(p+1) *(p+2)

    1、定义字符数组的时候 赋值字符串(有)
    2、scanf gets strcpy (自动加)
    循环赋值 手动添加

    新内容
    1、多级指针(二级指针)
    指向指针的指针 存放的是指针的地址
    2、指针运算
    * [] & + - ++ --
    * 解引用 主要用于指针 取得指针指向的元素(取值)
    (同样可以用于数组)
    [] 同样有解引用的作用
    arr[2]//去下标为2的元素 *(arr+2) 数组指针都可以这样用
    *(arr+2) *(arr+2)--->2[arr]
    *(arr+2) arr是指针或者数组名n是int--->arr[n]
    *(p+n)等价p[n]
    & 取变量地址

    指针可以进行加减运算
    指针和int进行加减
    p+1--->&p[1]//指针的运算 p+1指向下一个元素
    指针的++和--(指针运算 也有越界的可能 p+9---->arr[10]越界)
    指针和指针 相加没有意义
    指针和指针相减 指向同一个数组的不同元素的指针可以相减 其他情况没有意义
    p指向arr[4] q指向arr[7]
    p-q=4-7=-3(就是两个元素之间隔得多远 距离)
    -->比较关系 > < 指向不同位置之间的元素可以相减(就是下标之间的相减)

    3、数组和指针的关系
    一维数组 对应的是以及指针
    int arr[10]; int*p; p=arr;//数组名可一直接赋值一级指针
    用法是一样的 数组名赋值的时候相当于数组首地址
    用里面的元素 *p p[n]
    (数组名 不能++ 常量不能++ 也不能赋值)

    二维数组 (数组的数组)
    int dArr[7][8];// dArr 首元素的地址 &dArr[0]//取一行的地址 数组的地址 对应 数组的指针
    int(*pArr)[8]; //数组指针 pArr=dArr
    数组名相当于数组首地址 不是变量 常量 但是不能作为左值 也不能++--
    4、了解 const指针
    const int x=10;//定义常量必须赋值 const修饰的常量不能修改
    对于指针 有点特殊
    const int*y;和int const*y;效果一样
    const修饰的是*y y可以改变 但是*y不能修改
    int *const z 指针常量
    const直接修饰z 表示z不能修改 但是*z可以修改
    C语言中 const修饰变量 在栈区
    C++ 中 const修饰的是常量 在常量区

     

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main()
     4 {
     5     //int x;
     6     //printf("请输入大小:
    ");
     7     //scanf_s("%d",&x);//scanf_s与scanf是由于vs的版本不一样所用的形式不一样 其效果一样
     8     //char *p = (char*)malloc(sizeof(char)*x);//大小为x的数组
     9     //for (int i = 0; i < x; ++i)
    10     //{
    11     //    *(p + i) = 'A' + i;//随便赋的值 A=65
    12     //}
    13     //p[x - 1] = '';//最后一个元素
    14     //puts(p);//打印内容
    15     //int arr[10];
    16     //arr[0];
    17     //*(arr + 0);
    18     //getchar();
    19     //while (1);
    20     //free(p);//释放p的内存 申请的内存必须释放
    21     //return 0;
    22 
    23     //int x;
    24     //printf("请输入大小:
    ");
    25     //scanf_s("%d",&x);//scanf_s与scanf是由于vs的版本不一样所用的形式不一样 其效果一样
    26     //char *p = (char*)malloc(sizeof(char)*x);//大小为x的数组
    27     //for (int i = 0; i < x; ++i)
    28     //{
    29     //    *(p + i) = 'A' + i;//随便赋的值 A=65
    30     //}
    31     //p[x - 1] = '';//最后一个元素
    32     //puts(p);//打印内容
    33     //char **pp = &p;//得到的是指针变量的地址  一级指针的地址 用二级指针 保存
    34     ////pp保留的是p的地址
    35 
    36     //int x;
    37     //int*q = &x;//*q 代表着x
    38     //int**qq = &q;//qq指向q *qq代表着q **qq代表着是*q 也就是说代表着x
    39     //printf("x的地址:%p,
    q的地址:%p,
    qq的地址:%p
    ",&x,&q,&qq);
    40     //printf("q存放的值:%p,
    qq存放的值:%p
    ",q,qq);
    41 
    42     //int arr[10];
    43     //for (int i = 0; i < 10; ++i)
    44     //{
    45     //    arr[i] = i;
    46     //    printf("%d	",i[arr]);//i[arr] 一样 arr[i]  *(arr+i)
    47     //}
    48 
    49     //int arr[10];
    50     //int*p = &arr[1];
    51     //printf("arr[1]的地址:%p
    ",p);//这是arr[1]的地址
    52     //printf("p+3的值是:%p,
    arr[4]的地址是:%p
    ",p+3,&arr[4]);
    53 
    54     int dArr[7][8];
    55     int(*pArr)[8];//数组指针 8是列
    56     pArr = dArr;//二维数组首地址赋值给数组指针
    57     pArr[0][0];//解两次引用才是数组元素
    58     for (int i = 0; i < 7; ++i)
    59     {
    60         for (int j = 0; j < 8; ++j)
    61         {
    62             pArr[i][j];//dArr[i][j] 用指针操作数组中的元素
    63             //相同的 *(*(pArr+i)+j);
    64         }
    65     }
    66 
    67     getchar();
    68     while (1);//防止闪屏
    69     return 0;
    70 }

     2018-07-25  11:46:15

  • 相关阅读:
    UML类图
    mongo存储的DoraCMS系统
    docker+ceph实现私网云盘
    MongoDB sharding分片
    ES数据库安装6.6
    ceph_docker_apache_nginx_ansible面试
    用户中心_单点登录
    金丝雀发布、滚动发布、蓝绿发布到底有什么差距?关键点是什么?
    ticket、token、rpc是什么
    TCP/IP的三次握手以及四次挥手
  • 原文地址:https://www.cnblogs.com/Yuuki-/p/9365120.html
Copyright © 2011-2022 走看看