• C++学习(十七)(C语言部分)之 指针


    复习 数组
    定义格式 类型 数组名[数组大小]
    数组名+下标

    int arr[2][3]={{1,2,3},{4,5,6}};
    int arr[][3]={1,2,3,4,5,6};//二维数组定义的时候赋值 不能省略列 但可以省略行

     

    内存地址 内存(字节) 每个字节编号(地址)
    指针--->存放地址的类型 & 取地址 *取值(解引用)

    指针定义
    类型 *指针的名字 定义指针的格式 (类型 指针保存变量类型的地址)
    (point 指针)
    指针 可以通过地址修改/访问其他变量值
    一般用在 内存申请+函数传参
    指针 一般涉及到指针变量一个指向的方向

    指针的类型
    指针指向的数据的类型
    指针--->内存 一条大街 每个字节--->门牌号(地址)
    指针就是存放地址的变量

    int *p
    int 表明p指向一个int类型的变量
    int* 表明指针是int*类型

    使用过程中 p 表示指针变量 地址
    *p 表示指针指向的内容 int
    地址不一样 操作不一样
    指针存的是什么东西 (地址)
    指针如何赋值 如何使用(p *p)
    p表示地址 *p是值

    指针赋值 赋值变量的地址 &x 得到当前变量的地址
    (每次运行的时候 变量地址未必一致)
    NULL (特殊规定 指针没有指向任何变量 赋值)
    指针 先复制 然后使用
    变量没有赋值不能使用 指针没有赋值页不能使用
    int x;
    printf("%d",x);乱码
    规定 如果指针没有指向内容 让指针赋值为NULL (相当于指针的默认值 需要手动赋值)
    指针赋值后使用 *p
    操作 *p操作指向变量的值

    *解引用 只能用于指针
    一级指针 int *p/double *p/float *p/char *p

    内存的分配 一次程序运行的时候变量分配的地址是不变的
    指针很麻烦 并且不实用

    指针 1.能不能存值--->
    int x;
    int *p;
    p=1;//操作是错误的 赋值时地址
    int*p=x;//x int类型 赋值指针 错误的
    p=&x;

    指针 2.麻烦
    指针去修改变量的值
    变量可以通过变量名去修改
    有一种情况 不能通过变量名去修改 必须用到指针 函数传参

    指针 3.必须使用指针
    内存四区 --->定义一个变量 (在内存中分配一块地址)
    栈区 (定义变量 定义在栈区) 内存不需要管理 自动分配内存 自动释放 (缺点 栈溢出 大概只有4M空间 再大就管理不了) 例如arr[1000000000000];
    堆区 (手动申请 手动释放 必须用指针操作) 手动确定数组大小(动态数组) 堆区
    全局静态常量区 存放全局变量 静态变量 常量 (比栈区大)
    代码区 (存放代码二进制)
    函数里面定义的变量 在栈区
    堆区 用函数申请释放
    全局变量 放在main函数外面 在函数外部定义的变量
    静态 static 修饰的变量
    字符串常量---->存放在常量区 常量 数据不能修改

     

     

     1 #include<stdio.h>
     2 #include<stdlib.h>//srand rand sysytem malloc free
     3 int main()
     4 {
     5 #if 0
     6     
     7     int x = 0;//定义变量 赋值
     8     //取到x的地址
     9     int *p;//定义  定义变量
    10     p= &x;//赋值   给指针赋值
    11     printf("%p
    ",p);//打印p的值(地址)
    12     *p = 20;//修改的x 操作*p和操作x 用指针去修改另外一个变量的值
    13     if (p == NULL)
    14     {
    15         //说明指针没有指向任何内容 不能使用 *p 
    16     }
    17     printf("%p
    ",p);//打印p的值(地址)
    18     printf("%p
    ",&x);//打印地址 格式占位符%p
    19     //假设需要申请一块空间 存放int   malloc(sizeof(int)*1);//申请内存 返回一个地址 必须用指针保存 ()里面是申请的内存的大小 一般搭配sizeof 返回一个地址 括号里面的数字 表明大小 单位是字节
    20     //malloc 内存申请 分配多少空间
    21 
    22     //使用时和数组一样
    23     int*q = (int*)malloc(sizeof(int)* 100);
    24     *q=2;//操作第一个int *(q+n) 操作第n+1个int *(q+0)~*(q+99)
    25     q[0] = 2;//q[n]相当于 *(q+n) 
    26     for (int i = 0; i < 100; ++i)
    27     {
    28         *(q + i) = i;//通过指针 使用堆内存
    29         //或者 q[i]=i;
    30         printf("%d",*(q+i));
    31     }
    32     //q[100];//越界
    33     //*(q+100);//越界
    34     int*myPoint = (int*)malloc(sizeof(int)*x);//内存申请 数组在堆区 大小 是由变量来决定的 动态数组
    35     //int arr[100];//数组大小必须是常量  静态数组
    36 
    37     free(q);//堆区内存必须要手动释放
    38     free(myPoint);
    39     while (1)
    40     {
    41         malloc(sizeof(int)*1000);
    42     }
    43 #endif
    44 
    45 #if 1
    46     char mystr[] = "hello world";//mystr 数组 栈区
    47     char *pstr = "hello world";//pstr定义的是指针 保存的是地址 保存的是字符串的地址
    48     //char*pstr="hello world";//常量区 内容不能修改
    49     //pstr = "hello world";//字符串的地址赋值给了pstr
    50     mystr[0] = '1';
    51     //pstr[0] = '1';//用指针修改了常量区的内容 所以会报错
    52     //*(pstr+0)='1';
    53 
    54 #endif
    55 
    56     getchar();
    57     return 0;
    58 }

     

    1.指针 定义格式 int*p int表示p要指向的内容(p保存的变量的地址) *表示这是指针 p表示指针的名字
    使用方式 赋值 用地址给指针赋值(需要一个额外的变量)
    使用 *p 代表p指向的内容

    2.内存四区
    栈区
    堆区
    全局静态常量区(全局区)
    代码区

    3.特殊指针用法
    堆区的内存申请释放 malloc free 头文件 stdlib.h
    char*p="hello"和char arr[]="hello"的区别

    注意事项 1.指针使用的时候必须向赋值然后使用
    2.指针只能赋值地址
    3.内存申请必须释放 不释放会占内存 直到重启
    4.定义指针int*p
    p相当于地址 *p相当于指向的内容
    5.不同类型指针不能互相赋值 (类型不一样 操作也不一样)
    //除了malloc 不考虑任何强转

     

     

     

    2018-07-20   10:29:29

     

  • 相关阅读:
    How to read a whole document content into a string onetime
    how to get the Authorization of adobe acrobat 8.0 for free
    给求职的同学的几点建议
    select() manul select() 手册
    有无一步登天之法?
    VB6.0 Excel模版,自己設定好分析餅圖,如何動態地更新分析圖的數據源呢?
    C#中的委托和事件(续)
    C# 中的委托和事件
    VB6.0 Excel的動態生成多個Sheet的方法
    VB6.0 用Excel生成數據分析餅圖例子
  • 原文地址:https://www.cnblogs.com/Yuuki-/p/9340110.html
Copyright © 2020-2023  润新知