指针地址,数据类型及指针的大小
#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。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...
*/