【const】与指针、数组、结构体的使用

目录

指针与数组

指针与const

const

const的作用

const int *与 int* const

const的错误使用

const char* arr和char arr[10]的区别

结构体与const


指针与数组

  • 指针可访问数组下标
    • 如下,在输出函数Show中利用指针P访问数组arr的下标
    • void Show(int* p, int length)//输出函数
      {
          for (int i = 0; i < length; i++)
              printf("%d", p[i]);
              //或者printf("%d", *(p+i)),p[i]等价于*(p+i)
      }
      
      int main()
      {
          int arr[] = { 1,2,3,4 };
          Show(arr, sizeof(arr) / sizeof(arr[0]));
      }

指针与const

const

  • C和C++区别:
    • 在c中,const 是只读变量
    • C++,const 是常量

const的作用

  • 可以定义一个常量
    • const int a=10; //a为常变量,不可修改
    • 常量必须在定义时初始化,不能定义后再赋值
      • const int a; a=10;//这样就不对
  • 可以定义函数参数
    • char *strcpy(char *dst, const char *src);//const char *src,表示函数strcpy不会修改 src指向的内容

  • 提高程序健壮性和可读性
    • const 可以修改函数形参——提高程序的可读性和健壮性

    • 例:char *strcpy(char *str1,const char *str2);//复制函数

    • 第二个字符串有const,程序员一看看过去就会知道,将不可修改的字符串str2放到可修改的字符串str1内,提高程序可读性。

    • 与此同时,加了const,不可被修改,提高程序健壮性

  • 可以定义函数的返回值
    • const char *str = GetString(); //表明该函数返回内容不能被修改
    • 补充一道面试题~
      • 问:char *strcpy(char *dest,const char *str);该函数中,第一个cosnt代表的是目的字符串首地址,为什么还需要函数返回值?

      • 答:为了实现链式表达式(函数整体作为另外一个函数的参数出现)

  • 可以定义常成员函数
    • 常成员函数:在函数的()后面加const
    • void Show()const;
    • 在当前函数中不能修改本类数据成员的值

const int *与 int* const

  • const int *p=&a; //允许p指向a,但是不可修改a,p可以任意指向。a是常量,不允许修改。
  • int* const p=&a; //此时,const修饰p变量,p只能指向a,也可修改a(当前仅当a是变量),但是p不可以任意指向。
  • (可以这样理解记忆,只记忆哪个不能变:const int *p=&a,const后面是int *p,因为*p=a,所以a的值不变 ;int* const p=&a,const后面是p,修饰p,p格子内容是a的地址,p被const,因此格子不变,p的指向不变。
  • 补充例题
  •  

  • 解:

    const在*前面:const修饰的是内容

    const在*后面:修饰的是指针=============p1=========================================

    p1指向a

    *p1=10

    const在*前面,修饰*p1,说明10不能修改,但可以修改a,修改了a,*p的值也修改了;但不能通过修改*p来修改a。

    ============p2==========================================

    不用关注int的位置,只用看const和*的位置就行,因此,p2和p1等价

    ============p3==========================================

    p3是指针型变量,const修饰的是p3本身,而不是*p3,p3不能修改,*p3可以修改,修改了*p3,a同时也会被修改。但是p3不能被修改指向

    ============p4==========================================

    p4是指针型变量,第一个const修饰p4指向的内容,第二个const修饰p4,说明p4不能修改,也不能修改p4的指向

const的错误使用

  • const int a=10; int* p=&a;/
    • 第二行定义指针p指向a可修改a,但第一行定义a为常量不允许被修改,自相矛盾,所以编译器提醒错误
  •  const int a=10;  int *const p=&a;

    • ​​​​​​​​​​​​​​

      • 第二行的说明p可以修改a的值,但第一行定义a是常变量,自相矛盾。
      • 这样写是对的,因为第一行的含义是不能修改a的值

const char* arr和char arr[10]的区别

  •         内存上:
    • ​​​​​​​​​​​​​​                ​​​​​​​​​​​​​​​​​​​​​指针占用4个字节,数组的内存可能比较大​​​​​​​
      •         使用上:
        •                 ​​​​​​当字符串常量赋值给指针和数组后,指针不可以修改字符串,而数组可以修改字符串的值:因为数组是把字符串常量“复制”到数组内,是可以修改的;而指针的声明,指向的是字符串常量的地址,常量只读不可修改。

结构体与const

  • 强调一下修改const的问题:
  • 举例下面定义一个student的结构体,内部有姓名,年龄和性别的变量:
    • struct Student
      {
          const char* name;
          int age;
          char sex;
      };
      
      int main()
      {
          struct Student s1 = {"李四",14,"男"};
      }
  • 说明:在结构体内定义const char* name,指明姓名不能被修改,这样的用法是正确。但如果用const修饰性别时(const char sex),可以将s1.sex=‘女’修改指向。“男”修改为“女”,但不能将“男”修改为“男性”,意思就是:修改时,并不是修改原来的字符串,而是修改了变量的指向

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值