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;
}