C的学习7(指针)

指针地址,数据类型及指针的大小 

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
	int tab[10];
	for (int i = 0; i < 10; i++)
	{
		tab[i] = i;
		printf("tab[%d] value =%d ,十进制输出地址为:%d,16进制输出地址为:%p\n",i,tab[i], &tab[i],&tab[i]);
		
	}

	printf("%d", sizeof(tab[1]));  //一个整型的字符大小为 4 bytes = 32 bits ,所以在后面输出地址的时候,tab[1]与tab[2]的地址值相差为4
	printf("size of integer is %d bytes\n", sizeof(int));	//这里的地址指的是这个整型变量的首地址,*p	表示的是解引用,那么指针在寻址时就会从该变量的首地址开始寻址
	//整型的第一bits是sign值0为负 1为正
	printf("size of chart is %d bytes\n", sizeof(char));
	printf("size of double float is %dbytes\n", sizeof(double));
	printf("size of float is %d bytes\n", sizeof(float));
	printf("size of integer star is %d bytes\n", sizeof(int*));
	int a = 1025;
	//printf("size of a is %d ",1025);
	int* p;
	p = &a;
	printf("p's adress = %d,*p's value = %d\n", p, *p);

	char* p0;
	p0 = (char*)p;		//进行了强行转换把 p的地址转换给了p0
	printf("p0's adress = %d,p0's value = %d\n",p0,*p0);  //这里p0的数值为1 因为 1025 = 00000000 00000000 00000100 00000001,因为char只占有一个字的大小,那么机器之后读00000001  


	void* p1;
	p1 = p;
	printf("p1的地址为%d\n",p1);
	//printf("p1的数值为%d",p1);这个会报错
	//(int*)p1;//强制转换后就可以输出
	//printf("p1的数值为%d\n", p1);
	//printf("p1的地址为%d\n", (p1+1));会报错,因为void类型没有规定的字符数
	int** q; //可以用来存放指针的地址
	q = &p;
	printf("\n", p1);
	printf("q的指向的地址为%d\n", q);
	printf("p的地址为%d\n", &p);
	printf("p的指向的地址为%d\n", p);
	return 0;
}

/*
在vs2017的输出结果为:


tab[0] value =0 ,十进制输出地址为:15727072,16进制输出地址为:00EFF9E0
tab[1] value =1 ,十进制输出地址为:15727076,16进制输出地址为:00EFF9E4
tab[2] value =2 ,十进制输出地址为:15727080,16进制输出地址为:00EFF9E8
tab[3] value =3 ,十进制输出地址为:15727084,16进制输出地址为:00EFF9EC
tab[4] value =4 ,十进制输出地址为:15727088,16进制输出地址为:00EFF9F0
tab[5] value =5 ,十进制输出地址为:15727092,16进制输出地址为:00EFF9F4
tab[6] value =6 ,十进制输出地址为:15727096,16进制输出地址为:00EFF9F8
tab[7] value =7 ,十进制输出地址为:15727100,16进制输出地址为:00EFF9FC
tab[8] value =8 ,十进制输出地址为:15727104,16进制输出地址为:00EFFA00
tab[9] value =9 ,十进制输出地址为:15727108,16进制输出地址为:00EFFA04
4size of integer is 4 bytes
size of chart is 1 bytes
size of double float is 8bytes
size of float is 4 bytes
size of integer star is 4 bytes
p's adress = 15727048,*p's value = 1025
p0's adress = 15727048,p0's value = 1
p1的地址为15727048

q的指向的地址为15727036
p的地址为15727036
p的指向的地址为15727048

C:\Users\Administrator\Desktop\vs\Project4\Debug\Project4.exe (进程 13548)已退出,返回代码为: 0。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...


*/

多级指针

#include<stdio.h>
int main(void)
{
	int a = 100;
	int* p;
	int** pp;
	int*** ppp;
	int**** pppp;
	p = &a;
	pp = &p;
	ppp = &pp;
	pppp = &ppp;
	printf("a的地址为%d\n", &a);
	printf("p指向的地址为%d\n", p);
	printf("p的地址为%d\n", &p);
	printf("pp指向的地址为%d\n", pp);
	printf("pp的地址为%d\n", &pp);
	printf("ppp指向的地址为%d\n", ppp);
	printf("ppp的地址为%p\n", &ppp);
	printf("pppp指向的地址为%p\n", pppp);
	printf("pppp的地址为%p\n", &pppp);
	printf("pppp一层*为%p\n", *pppp);
	printf("pppp二层*为%p\n", **pppp);
	printf("pppp三层*为%p\n", ***pppp);
	printf("pppp四层*为%p\n", ****pppp);
	printf("a的地址为%p\n", &a);
	printf("p指向的地址为%p\n", p);
	printf("p的地址为%p\n", &p);
	printf("pp指向的地址为%p\n", pp);
	printf("pp的地址为%p\n", &pp);
	printf("ppp指向的地址为%p\n", ppp);
	printf("ppp的地址为%p\n", &ppp);
	printf("pppp指向的地址为%p\n", pppp);
	printf("pppp的地址为%p\n", &pppp);
	printf("pppp一层*为%p\n", *pppp);
	printf("pppp二层*为%p\n", **pppp);
	printf("pppp三层*为%p\n", ***pppp);
	printf("pppp四层*为%d\n", ****pppp);
	//很显然是一级一级的指向

	return 0;
}
/*

a的地址为19920624
p指向的地址为19920624
p的地址为19920612
pp指向的地址为19920612
pp的地址为19920600
ppp指向的地址为19920600
ppp的地址为012FF6CC
pppp指向的地址为012FF6CC
pppp的地址为012FF6C0
pppp一层*为012FF6D8
pppp二层*为012FF6E4
pppp三层*为012FF6F0
pppp四层*为00000064
a的地址为012FF6F0
p指向的地址为012FF6F0
p的地址为012FF6E4
pp指向的地址为012FF6E4
pp的地址为012FF6D8
ppp指向的地址为012FF6D8
ppp的地址为012FF6CC
pppp指向的地址为012FF6CC
pppp的地址为012FF6C0
pppp一层*为012FF6D8
pppp二层*为012FF6E4
pppp三层*为012FF6F0
pppp四层*为100

C:\Users\Administrator\Desktop\vs\Project5\Debug\Project5.exe (进程 16036)已退出,返回代码为: 0。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...

*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值