• 38.【C语言】指针(重难点)(C)


    目录:

    8.const 修饰指针

      *修饰普通变量

      *修饰指针变量

    9.指针运算

      *指针+或-整数

      *指针-指针

      *指针关系运算

    往期推荐

    承接上篇37.【C语言】指针(重难点)(B)

    8.const 修饰指针

    const 全称 constant adj.不变的

    *修饰普通变量

    1. #include
    2. int main()
    3. {
    4. const int num = 0;
    5. num = 20;
    6. printf("%d\n", num);
    7. return 0;
    8. }

    这样写会报错

    说明const修饰的值不可改变

    注:在C语言中,这里的num是常变量,num的本质还是变量,因为有const修饰,编译器在语法上不允许修改这个变量;而在C++语言中,这里的num就是常量

    如果要强行改变,用指针

    1. #include
    2. int main()
    3. {
    4. const int num = 0;
    5. int* pi = #
    6. *pi = 2;
    7. printf("%d\n", num);
    8. return 0;
    9. }

     

    但显然已经违反常变量的语法规则,需要限制指针的行动-->const修饰指针变量

    *修饰指针变量

    三种写法

    1.const 放在*的左边

    const int* pi = # int const * pi = #

     

     语法规则:指针指向的内容不能通过指针来改变,但是指针变量本身的值是可以改

    *pi=?; 错误        pi=&n;正确

    2.const 放在*右边

    int* const pi = #

    语法规则: 指针指向的内容能通过指针来改变,但是指针变量本身的值是不可改

    *pi=?; 正确        pi=&n;错误

    3.const 放在*的左右两边

    const int* const pi = #

    语法规则:由1,2推, 指针指向的内容不能能通过指针来改变,且是指针变量本身的值是不可改

    9.指针运算

    *指针+或-整数

    37.【C语言】指针(重难点)(B)中已提到一些内容

    练习:因为数组在内存中连续存放,所以可以用指针打印数组

    1. #include
    2. int main()
    3. {
    4. int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    5. int* pi = &arr[0];
    6. int length=sizeof(arr)/sizeof(arr[0]);
    7. for (int i=0;i
    8. {
    9. printf("%d ", *(pi+i));//注意pi不变
    10. }
    11. return 0;
    12. }

    *指针-指针(即地址-地址)

    大地址-小地址 和 小地址-大地址 ,注意有正负

    1. #include
    2. int main()
    3. {
    4. int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    5. printf("%d",&arr[8] - &arr);
    6. return 0;
    7. }

     

    总结:当两个指针指向同一个空间时,(指针-指针)的绝对值==指针之间的元素个数

    进一步思考:

     求字符串长度:

    1.strlen函数

    strlen(数组); 统计\0之前的元素个数

    1. #include
    2. int main()
    3. {
    4. char arr[] = { "asdfghjk" };
    5. size_t result=strlen(arr);
    6. printf("%d", result);
    7. return 0;
    8. }

    具体见20.5.【C语言】求长度(sizeof和strlen)的两种方式

    2.用指针

    未遇到\0则指针++

    1. #include
    2. int main()
    3. {
    4. char arr[] = { "asdfghjk" };
    5. char* pi = &arr;//&数组名就是&数组名[0]
    6. int result = 0;
    7. //可以简写成while (*pi) \0的ASCI值是0
    8. while (*pi != '\0')//未到\0则继续循环
    9. {
    10. result++;
    11. pi++;//指针移动
    12. }
    13. printf("%d", result);
    14. return 0;
    15. }

    也可以改成指针-指针

    printf("%d", pi-&arr);

      *指针(大小)关系运算 

    可以用来打印数组

    1. #include
    2. int main()
    3. {
    4. int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
    5. int* pi = &arr;
    6. int sz = sizeof(arr) / sizeof(arr[0]);
    7. while (pi < &arr[sz])//&arr[sz]越界不会产生影响
    8. {
    9. printf("%d ", *pi);
    10. pi++;
    11. }
    12. return 0;
    13. }


    往期推荐:

    19.【C语言】指针(重难点)(A)

    37.【C语言】指针(重难点)(B)

  • 相关阅读:
    JS条件表达式
    尚硅谷axios笔记——入门学习
    mac 安装部署mongoDB社区版
    MySQL -- 复合查询及内外连接
    three.js调试工具dat.gui使用
    POSIX信号量
    k8s2-5日常使用操作指令
    《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)
    希望你多出去看看,别活在短视频和文字里!
    idea的output输出乱码的问题
  • 原文地址:https://blog.csdn.net/2401_85828611/article/details/140981844