指针本身和所指变量都可能const
        【摘要】 第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]了。 
 - int sum(const int a[],int length);
 
指针运算
#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表示要让指针指向下一个变量
 
- int a[10];
 - int *p=a;
 - *(p+1)->a[1]
 - 如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义
 - *(p+n)->ac[n]
 
- 这些运算可以对指针做
 
- 给指针加、减一个整数(+,+=,-,-=)
 - 加是往后挪,减是往前挪
 - 递增递减(++/–)
 
两个指针相减
#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)