C语言程序设计 学习笔记 指针运算

C语言程序设计 指针运算

一个指针加1=?
用代码试验一下:

#include<stdio.h>

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

p = 000000000062FE30
p+1 = 000000000062FE31

再将char字符串换成int

#include<stdio.h>

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

p = 000000000062FE30
p+1 = 000000000062FE31
q = 000000000062FE00
q+1 = 000000000062FE04

p和p+1位置差1,但是q和q+1差4位
4是什么??
因为sizeof(char) = 1,sizeof(int) = 4

所以指针+1并不是地址值加1,而是增加一个本身字符类型的sizeof()
解释:
对于char,每一个位置所占字符位为1,指针指向下一单元即a+2
对于int,每一个位置所占字符位为4,同理,指针指向下一单元即a+4
所以对指针做一个+1的动作,意味着将其指向下一单元
同样的,用double,long等也是同样的意思

指针计算:
这些算术运算可以对指针做:
·给指针加、减一个整数(p+2,p+=2等)
·自加自减(++,–)
·两个指针相减
对于指针相减,我们可以写代码尝试一下:

#include<stdio.h>

int main(){
	char ac[] ={0,1,2,3,4,5,6,7,8,9};
	char *p = ac;
	char *p1 = &ac[5];
	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("q1 - q = %d\n",q1-q);
	return 0;
}

此时输出结果分别是5,6
对于p1 - p,不难看出就是下标为5减去下标为0,距离为5
但是q1 - q,距离是6,可以输出一下q1和q,分别为

q = 000000000062FDF0
q1 = 000000000062FE08

这两者的距离是E08 - DF0 = 24
那就不难理解这个6的值的由来是
24 / sizeof(int)即24 / 4 = 6
那么对于p1 - p,那就是
5 / sizeof(char) 即 5 / 1 = 5
所以指针间相减的意思是在这两个地址之间有几个相同类型的元素在其中

*p++
·取出p所指的那个数据来,完事之后顺便把p移到下一个位置去
·“ * ”的优先级虽然高,但是没有“ ++ ”高
·常用于数组类的连续空间操作
·在某些CPU上,这可以直接被翻译成一条汇编指令

指针比较:
·<,<=,==,>,>=,!=都可以对指针做
·作用:比较它们在内存中的地址
·数组中的单元的地址肯定是线性递增的

0地址:
·当然内存中有0地址,但是0地址通常是个不能随便碰的地址
·所以指针中不应该具有0值
·因此可以用0地址表示特殊的事情:
·返回的指针是无效的
·指针没有被真正初始化(先初始化为0)
·null是一个预定定义的符号,表示0地址
·有的编译器不愿意用0表示0地址
因此通常如果设定一个空指针,那应该令其等于null,而不是等于0

指针的类型
·无论指向什么类型,所有的指针大小都是一样的,因为都是地址
·但是指向不同类型的指针是不能直接互相赋值的,这是为了避免用错指针

这样的后果可能会:
令q = p(int *q, char *p)q是int类型的指针,现在指向了p所指向的数组,此时如果让q = 0,那么对于原地址的char数组其ac[0]~ac[3]的内容会全变成0,这个操作显然非常危险

指针的类型转换
·void* 表示不知道指向什么东西的指针
·计算时与char*相同(但不互通)
·指针也可以转换类型,如

int *p = &i ;
void *q = ( void * )p;

·这并没有改变p所指的变量的类型,而是让后人用不同的眼光通过p看它所指的变量
这往往会用在底层程序中,萌新用到的次数并不多

总结 用指针可以来做什么?
·需要传入较大的数据时用作参数
·传入数组后对数组做操作
·函数返回不止一个结果的时候(需要用函数来修改不止一个变量)
·动态申请的内存

猜你喜欢

转载自blog.csdn.net/a656418zz/article/details/83447102