初出茅庐的小李第91篇博客之C语言指针

学如逆水行舟不仅则退

今天老板写了一篇文章让我帮忙校验一下,于是我就有了下面的代码标题的感悟

#include <stdio.h>
typedef unsigned char uchar;
int main(void) 
{
	int i, *ip = &i;
	printf("i的地址空间是:%p\n",ip);
	//uchar *niu;      //niu指向的地址空间存放的数据是uchar类型的数据 
	//uchar **sp;      sp是一个指针变量 uchar ** 是sp指针的类型  
    //	               uchar * 含义是指针指向的地址空间内所存储的类型是 uchr *这种类型  
    //					  显然uchar *这也是一个指针变量该变量指向的地址空间所存//储的类型是 uchar 类型 
	uchar a,b,c,d,e,f,g,h,x,y,z;
	uchar niu[12] = {3,1,7,5,9,19,8,2,5,6,6,8};
	uchar *sp;
	sp = niu;//数组名也是指针类型 也是一个地址
	a = *sp; //此时*含义代表取sp指针存放的地址空间的数据内容是多少
	printf("a = *sp 结果:a = %d\n",a) ;//a = *sp 结果:a = 3
	b = *sp + 1;
	printf("b = *sp + 1 结果:b = %d\n",b);//b = *sp + 1 结果:b = 4
	c = *sp++;
	printf("c = *sp++ 结果:c = %d\n",c) ;//c = *sp++ 结果:c = 3
	d = *sp;//指针经过上次就算偏移地址加1 指向3变成指向1 
	printf("d = *sp 结果是:d = %d\n",d);//d = *sp 结果是:d = 1
	e = *(sp+1);//指针指向再加1后指向内容是 7 取内容是7 
	printf("e = (*sp+1) 结果是:e = %d\n",e);//e = (*sp+1) 结果是:e = 7
	f = *sp;//指针不加1指向的内容就是1 
	printf("f = *sp 结果是:f = %d\n",f);//f = *sp 结果是:f = 1
	x = sizeof(niu) ;//数组niu所占的字节数目 
	printf("x = sizeof(niu) 结果是:x = %d\n",x);//x = sizeof(niu) 结果是:x = 12
	y = sizeof(sp);//指针变量所占用的内存空间   跟编译器有关 
	printf("y = sizeof(sp) 结果是:y = %d\n",y);//y = sizeof(sp) 结果是:y = 8
	z = sizeof(*sp);//*sp的数据类型指向是 uchar uchar所占的字节宽度
	printf("z = sizeof(*sp) 结果是:z = %d\n",z);//z = sizeof(*sp) 结果是:z = 1
	g = *(sp+sizeof(*sp)) ; //等价于*(sp+ 1)  指向数组元素 1 后面的元素  这里是元素 7 
	printf("g = *(sp+sizeof(*sp)) 结果是:g = %d\n",g);//g = *(sp+sizeof(*sp)) 结果是:g = 7
	h = *(sp+sizeof(sp)) ;
	printf("h = *(sp+sizeof(sp)) 结果是:h = %d\n",h);//h = *(sp+sizeof(sp)) 结果是:h = 6
	return 0; 
}

运行结果
在这里插入图片描述

#include <stdio.h>
typedef unsigned char uchar;
int main(void) 
{
	uchar a,b,c,d,x;      
	uchar niu[]="edu118";
	printf("niu的地址是:%p\n",niu);
	uchar nsd[6]="edu118";
	printf("nsd的地址是:%p\n",nsd);
	uchar *sp,*ss;
	sp=niu;
	printf("sp的地址是:  %p\n",sp);
	ss=nsd;
	printf("ss的地址是:  %p\n",ss);
	a = *sp;   //a被赋值为字符'e' 
	printf("a = *sp 的结果是:    %c\n",a);
	b = sp[0]; //b被赋值为字符'e' 
	printf("b = sp[0] 的结果是:  %c\n",b);
	c = sp[5]; //c被赋值为字符'8' 
	printf("c = sp[5] 的结果是:  %c\n",c);
	d = *(sp+6); //d被赋值为'\0' 
	printf("d = *(sp+6) 的结果是:十进制:%d 字符:%c\n",d,d);
	x = *(ss+7);  
	printf("x = *(ss+7) 的结果是:%d\n",x) ;
	return 0; 
}

在这里插入图片描述
知识还是要用起来,学习还要日积月累

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值