C语言中的变量、指针

C语言中的变量

C语言中其实就是把变量按照不同的位宽分成了不同的类型

8位 位宽

  • char有符号字符型
  • unsigned char无符号字符型

16位 位宽

  • short有符号短整型
  • unsigned short无符号短整型

32位 位宽

  • int有符号整形
  • unsigned int无符号整形
  • float浮点数

64位 位宽

  • double双精度

多位宽变量

struct结构体可以包含很多子变量,也是一片连续的内存空间。

指针型变量

​ 指针就是地址,所有32位处理器地址空间就是 2 32 2^{32} 232,所以指针变量的位宽是32位。

地址的位宽与CPU总线的位宽是有关系的,比如CPU是32位的,地址空间就是32位;数据空间是根据指针的类型定义的。

  • char*占32位地址空间,但是地址指对应的内存空间的数据是8位的。举例就是好比一个地址位宽为32bit的RAM, 数据位宽是8bit。

    地址是32位的,地址所对应的数据是char类型的,即数据位宽是8位的。

  • short *类型同理占32位地址空间,但指向的数据空间为16位;即RAM的地址位宽为32位,数据位宽为16位,

C语言指针


struct eg
	{
 	    int x;
 	    int y;
	};

int main(void) {
	int *p = NULL;
	int  a = 100;
	int  b = 100;
	
	int point = 6487572;
	eg *peg = (eg*)point;
	
	int *ptrx = NULL;
	int *ptry = NULL;
	
	ptrx = (int*)6487572;
	
	ptry = (int*)6487576;
	
	int *ptrxadd2 = (int*)6487580;
	
	int *ptryadd2 = (int*)6487584;

	printf("\tpeg->x:\t %d \r\n",peg->x);
	printf("\tpeg->y:\t %d \r\n",peg->y);
	peg->x = 100;
 	peg->y = 200;
//	
	printf("\tpeg->x:\t %d \r\n",peg->x);
	printf("\tpeg->y:\t %d \r\n",peg->y);

	printf("\tpeg->x+1:\t %d \r\n",(peg->x+1));
	printf("\tpeg->y+2:\t %d \r\n",(peg->y+2));
	
	printf("\t&peg->x:\t %d \r\n",(&peg->x));
	printf("\t&peg->y:\t %d \r\n",(&peg->y));
	
	printf("\t&peg->x+1:\t %d \r\n",(&peg->x+1));
	printf("\t&peg->y+2:\t %d \r\n",(&peg->y+2));

	printf("\tptrx:   \t %d \r\n",ptrx);
	printf("\tptry:   \t %d \r\n",ptry);	
	printf("\tptrx+1: \t %d \r\n",ptrx+1);
	printf("\tptry+1: \t %d \r\n",ptry+1);	
	printf("\tptrx+2: \t %d \r\n",ptrx+2);
	printf("\tptry+2: \t %d \r\n",ptry+2);	
	printf("\t*ptrx:  \t %d \r\n",*ptrx );
	printf("\t*ptry:  \t %d \r\n",*ptry );
	printf("\t*ptrx+1:\t %d \r\n",*ptrx+1);
	printf("\t*ptry+1:\t %d \r\n",*ptry+1);
	printf("\t*ptrx+2:\t %d \r\n",*ptrx+2);
	printf("\t*ptry+2:\t %d \r\n",*ptry+2);
	printf("\t*(ptrx+1):\t %d \r\n",*(ptrx+1));
	printf("\t*(ptry+1):\t %d \r\n",*(ptry+1));
	printf("\t*(ptrx+2):\t %d \r\n",*(ptrx+2));
	printf("\t*(ptry+2):\t %d \r\n",*(ptry+2));
	printf("\r\n");
	*(&peg->y+1) =208;
	*(&peg->y+2) =308;
	printf("\t*(ptrx+1):\t %d \r\n",*(ptrx+1));
	printf("\t*(ptry+1):\t %d \r\n",*(ptry+1));
	printf("\t*(ptrx+2):\t %d \r\n",*(ptrx+2));
	printf("\t*(ptry+2):\t %d \r\n",*(ptry+2));
	
	printf("\r\n");
	
	*((int*)6487584) = 508;
	printf("\tptrxadd2:\t %d \r\n",ptrxadd2);
	printf("\tptryadd2:\t %d \r\n",ptryadd2);
	printf("\t&ptrxadd2:\t %d \r\n",&ptrxadd2);
	printf("\t&ptryadd2:\t %d \r\n",&ptryadd2);
	printf("\t*ptrxadd2:\t %d \r\n",*ptrxadd2);
	printf("\t*ptryadd2:\t %d \r\n",*ptryadd2);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值