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
  • 相关阅读:
    Android 按键消息处理Android 按键消息处理
    objcopy
    SQLite多线程读写实践及常见问题总结
    android动画坐标定义
    Android动画效果translate、scale、alpha、rotate
    Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
    Flatten Binary Tree to Linked List
    Distinct Subsequences
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/heerha/p/13961634.html
Copyright © 2011-2022 走看看