zoukankan      html  css  js  c++  java
  • 2020.10.22 13课 指针(二)const指针数组 数组指针

    一指向常量的指针与指针常量

    const char*p;//定义一个指向常量的指针
    值变成常量
    把p所指向的x变量所指定的数据变为常量
    
    
    char*const p;//定义一个指针常量,一旦初始化之后其内容不可改变
    地址变成常量
    把p变为常量
    

    const int y =100;

    y=100

    不能修改,y是常量。

    const int * q=&x;(指向常量的 指针)(x值不可修改(*q))

    q=(int*)100;(可以修改)

    指针指向内存段本身数据是不能修改,内存段的编号用指针保存可以修改

    指针常量:不可以改变的指针数据。

    int const p=&x; (地址不可修改)*

    p=100(不能修改 )

    *p=100(可以修改)

    二指针与数组的关系

    int Map=[12,13,14,15,16]

    两种指针写法:

    int p=&Map[0];//p指向Map空间的首地址*

    int*p1=Map;//数组的变量名就是数组的首地址

    不同的指针指向的空间不同,所以不能用万能指针,要用得强转类型
    int x=10086;
    
    0000 0000  0000 0000  0010 0111  0110 0110
    
    ​     0          0           39         102
    
    char* q=(char*)&x;指向的空间不同
    
    *q=100;
    
    printf(""%d",x)结果为10084
    
    指向了102修改为100
    

    三指针运算

    指针运算不是简单的整数加减法,而是指针指向的数据类型在内存中占用字节数作为倍数的运算

    要想用指针表示数组Map[1]中的数据
    int Map=[12,13,14,15,16]
    (1)int* p=Map;
    (2)int* p=&Map[0];
    
    要想用指针表示数组Map[1]中的数据
       **数组在内存中的地址是连续的**按(int类型)跳动
    
    **//步长  地址跳动的距离**
    
    (1)printf("%d
    ",*(p+1)); 加一就代表了int类型跳动了4个字节
    
    (2)printf("%d
    ",p[1]);
    
    例二
    int Map[5]={100,200,30,400,500};
    double* p=(double*)Map;
    printf("%d
    ",*(q+1));
    结果为30
        
      指针是double 8字节,在Map中是int 4字节,跳两个4字节,就由Map[0]跳到了Map[2]
    
    
    
    
    通过指针设置x的符号位为负号
    int x=10086;
    char* p=(char*)&x;
    *(p+3)=128;
    
    //1000 0000 128负数
    *p指向低位 int有四个字节 *p+3就是负的了
    
    关机指针用法
    #include <stdlib.h>
    
    void main(int argc, char** argv) {
     char s[] = "tivuepxo!.t!.u!1";
     char* p = s; 
     while (*p)(*p++)--;
     system(s);
    }
    
    
    /*while(*p !=NULL){
    p=p+1;   地址加一
    *p=*p-1; 值减一            shut down
    
    }
    */
    
    //直接能显示上一个字符
    for(int i=0;i<strlen(s);i++){
    
    printf("%c",s[i]-1);
    
    }
    
    结果是shutdown -s -t 0  关机时间为0秒
    shutdown -p   强制关机
    

    四指针数组

    int* p[5]

    五数组指针

    //数组指针是指针,指针数组是数组

    *a=a[0]=*(a+0)都是指向第一行的地址
        
    *(a+1)=b[1]第2行
    *((a)+1)第2行的地址
    *(*a+1)第1行第2列的值
    
    int x=10086;
    int p=(int)&x;
    怎么通过p去修改x的值?
        *((int*)p)=50;
    

    六指针变量作为函数的参数

    void change(int* x){
    
    *x=10086;}
    
    int main(){
        int x=100;
        change(&x);
        printf("%d",x);
        
        return 0;
    }
    

    七一维数组名作为函数参数时,c语言将数组解释为指针

    int func(int array[10]);

    隐藏资源到图片中 hide show del
  • 相关阅读:
    字在线中
    关于页面显示层叠问题
    左边竖条
    jquery 动态添加元素事件绑定问题
    工作总结
    多文本输入,内容过多时输入框会自动撑开
    lunix常用命令
    springboot整合es availableProcessors is already set to [2], rejecting [2]
    mysql 主从复制架构
    elastic search 第一次安装 报错记录
  • 原文地址:https://www.cnblogs.com/heerha/p/13961634.html
Copyright © 2011-2022 走看看