指针本身和所指变量都可能const

举报
吴梦青 发表于 2022/06/05 09:17:17 2022/06/05
【摘要】 第7天:转换,const指针在函数内部不改变指针的值。指针运算,两个指针相减

转换

  • 总是可以把一个非const的值转换成const的
void f(const int * x);
int a=15;
f(&a);//OK
const int b=a;
f(&b);//OK
b=a+1;//ERROR

输入一个指针,在函数内部不改变指针所指的值。
用途:当要传递的参数的类型比地址大的时候(比如说结构体),这是常用的手段:既能用较少的字节数传递值给参数,又能避免函数对外面的变量的修改。跟数组类似,数组在传递的时候,是传递的指针。

const数组

  • const int a[]={1,2,3,4,5,6,};
  • 数组变量已经是const的指针了,这里的const表明数组的每个单元都是const int ,不能改变。
  • 所以必须通过初始化进行赋值,否则不能赋值了

保护数组值

  • 因为把数组传入函数时传递的是地址,所以那个函数内部可以修改数组的值
  • 为了保护数组不被函数破坏,可以设置参数为const
    • int sum(const int a[],int length);
      习题:
      对于:int a[] = {5, 15, 34, 54, 14, 2, 52, 72}; int *p = &a[5];则:p[-2]的值是?
      值应该是54,p是指向a[5]的,也就是说p[0]的内容就是a[5] 。那么p[1]的内容是a[6], p[-2]内容就是a[5]往前两个,也就是a[3]了。

指针运算

#include <stdio.h>

int main(void) {
	char ac[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	char *p = ac;
	printf("p=%p", p);
	printf("p+1=%p", p + 1);
	return 0;
}

输出结果:p=000000000061FE0E p+1=000000000061FE0F
p+1在p的地址上前进了一位。

#include <stdio.h>

int main(void) {
	char ac[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	char *p = ac;
	printf("p=%p", p);
	printf("p+1=%p", p + 1);

	int ai[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	int *q = ai;
	printf("q=%p", q);
	printf("q+1=%p", q + 1);
	return 0;
}

输出结果:p=000000000061FE06 p+1=000000000061FE07 q=000000000061FDD0 q+1=000000000061FDD4
原因:char是一位,int是4位,所以往后移动的长度不同,指针加1是加了一个sizeof。

*p->ac[0]
*(p+1)->ac[1]

指针运算小结

  • ac->&ac[0]
  1. 给指针加1表示要让指针指向下一个变量
  • int a[10];
  • int *p=a;
  • *(p+1)->a[1]
  • 如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义
  • *(p+n)->ac[n]
  1. 这些运算可以对指针做
  • 给指针加、减一个整数(+,+=,-,-=)
  • 加是往后挪,减是往前挪
  • 递增递减(++/–)

两个指针相减

#include <stdio.h>

int main(void) {
	char ac[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	char *p = ac;
	char *p1 = &ac[5];
	printf("p=%p\n", p);
	printf("p+1=%p\n", p + 1);
	printf("p1-p=%d\n", p1 - p);

	int ai[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	int *q = ai;
	int *q1 = &ai[6];
	printf("\nq=%p\n", q);
	printf("q+1=%p\n", q + 1);
	printf("q1-q=%d\n\n", q1 - q);
	return 0;
}

结果:p=000000000061FDF6
p+1=000000000061FDF7
p1-p=5

q=000000000061FDC0
q1=000000000061FDD8
q1-q=6
c0:192
D8:216
差值24。
24/4=6
指针的减法:地址差/sizeof(数据类型)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。