c指针与常量(完)

内容概要

  一、指向常量的指针

  二、常量指针

 

1、指向常量的指针

  -通过指针对变量进行修改

#include <stdio.h>

int main(){
    int a = 100;
    int *p = &a;
    
    printf("%d\n", *p);
    
    *p = 1000;  
    printf("*p: %d a: %d\n", *p, a);
    
    return 0;
}

 

  -尝试通过指针来修改常量

#include <stdio.h>

int main(){
    const int a = 100;
    int *p = &a;  // 这里会报错[Error] invalid conversion from 'const int*' to 'int*' [-fpermissive](我的理解是指针类型和指向的“变量类型”不同)
    
    printf("%d\n", *p);
    
    *p = 1000;  
    printf("*p: %d a: %d\n", *p, a);
    
    return 0;
}
#include <stdio.h>

int main(){
    const int a = 100;
    const int *p = &a;  //在int前加入const解决类型不一致问题
    
    printf("%d\n", *p);
    
    *p = 1000;  //这里会报错,尝试通过指针对一个只读变量进行修改操作
    printf("*p: %d a: %d\n", *p, a);
    
    return 0;
}

 

  -虽然指针变量p不能通过解引用的方式修改对应常量的值,但是它可以修改指向的对象,存储不同指针

#include <stdio.h>

int main(){
    const int a = 100;
    int b = 200;
    const int *p = &a;
    
    printf("%d\n",*p);
    
    p = &b;  //将指针指向b
    
    printf("%d\n",*p);
    
    return 0;
}
#include <stdio.h>

int main(){
    const int a = 100;
    int b = 200;
    const int *p = &a;
    
    printf("%d\n",*p);
    
    p = &b;
    
    printf("%d\n",*p);
    
    *p = 2000;  // 虽然指向了一个变量,而非常量,但依旧无法对修改值
    
    printf("%d\n",*p)
    
    return 0;
}

    将一个const int 指针指向一个没有const修饰的 int类型,并不能起到完全保护数据的作用(只是阻止了通过指针的方式修改变量),可以通过变量本身就行修改

#include <stdio.h>

int main(){
    const int a = 100;
    int b = 200;
    const int *p = &a;
    
    printf("%d\n",*p);
    
    p = &b;
    
    printf("%d\n",*p);
    
    b = 2000; // b被改了
    
    printf("%d\n",*p)
    
    return 0;
}

 

2、常量指针

  如果要使得指针变量存储的指针保持不变,那么就要使用常量指针(现在它是一个彻底的常量了)

#include <stdio.h>

int main(){
    const int a = 100, b = 200;
    const int * const p = &a;  //理解为(const int *)为数据类型;(const p)定义了一个常量
    
    printf("%d\n",*p);
    
    p = &b;  // 这里报错了,不允许改变存储的指针[Error] assignment of read-only variable 'p'
    
    printf("%d\n",*p);
    
    return 0;
}

 

***完***

posted @ 2021-03-13 15:54  口乞厂几  阅读(62)  评论(0)    收藏  举报