当前位置:   article > 正文

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

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

目录:

8.const 修饰指针

  *修饰普通变量

  *修饰指针变量

9.指针运算

  *指针+或-整数

  *指针-指针

  *指针关系运算

往期推荐

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

8.const 修饰指针

const 全称 constant adj.不变的

*修饰普通变量

  1. #include <stdio.h>
  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 <stdio.h>
  2. int main()
  3. {
  4. const int num = 0;
  5. int* pi = &num;
  6. *pi = 2;
  7. printf("%d\n", num);
  8. return 0;
  9. }

 

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

*修饰指针变量

三种写法

1.const 放在*的左边

const int* pi = &num; int const * pi = &num;

 

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

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

2.const 放在*右边

int* const pi = &num;

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

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

3.const 放在*的左右两边

const int* const pi = &num;

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

9.指针运算

*指针+或-整数

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

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

  1. #include <stdio.h>
  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<length;i++)
  8. {
  9. printf("%d ", *(pi+i));//注意pi不变
  10. }
  11. return 0;
  12. }

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

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

  1. #include <stdio.h>
  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 <stdio.h>
  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 <stdio.h>
  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 <stdio.h>
  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)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/974898
推荐阅读
相关标签
  

闽ICP备14008679号