目录
1.指针
1)地址
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
将某个变量的地址保存到新的变
量中,那么这个新的变量就叫做指针变量
注:内存储器使用十六进制编址
取地址实际操作如下:
int main()
{
int a = 10;
printf("%p\n", &a); //%p为打印地址的格式
//在内存中,使用了4个字节存储a,每个字节都有地址,但&a取出地址时,返回的是第一个字节地址(较小的地址)
return 0;
}
运行两次结果如下:
由此可知,每一次的运行,内存给变量分配的地址是不同的。
之后,通过F10进入调试阶段,点击菜单栏中的调试栏,进入窗口栏,在弹出菜单栏中选择内存,在选择内存1(任意选择,都可以)。进入内存选项卡
在上方的地址栏中输入刚才代码输出的变量地址,就可以看到该变量的地址以及所存储的值
如:
因为代码中我们定义a为int型变量,int型变量占变量4个字节,同时内存为十六位编址,两个十六位等以一个字节,所以我们可以看到图中,变量值一栏中,为0a 00 00 00 (后面的cc是因为没有分配地址导致的,a为十六进制的10)需要注意的是,在此处十六位显示时,是由左到右逐渐变大,但相邻的两个十六位是从右到左变大。
如图,是我将a=10改为a=16之后的显示结果。
如图,是我将a=16改为a=256的结果
所以以上就是内存存储变量的显示方式。
2)指针变量
那地址如何存储,需要定义指针变量。
该代码运行后,生成结果为20
注:num中存储的是a内存地址的第一个字节地址(较小的地址)
3)指针变量的大小
指针变量的大小取决于地址的大小
int main()
{
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*)); //猜一下代码输出结果为?
return 0;
}
代码生成结果为:
注:指针变量大小与指针变量所指对象大小是不同的
如:
int main()
{
int a = 10;
int* num;
num = &a;
printf("%d\n",sizeof(num));
return 0;
}
该代码返回值为指针变量num所指的对象a在内存中所占内存大小,结果为4
此处 x64指64位,返回值为8个字节
x86值32位,返回值为4个字节
4或8个字节指的是内存一次可调动的最大值 。
2.结构体
结构体作用:可以描述C语言中复杂类型。
比如学生:名字+年龄+性别+学号,而单独使用一个类型来描述,需要定义很多次类型,而结构体可以:
struct student
{
char name[20];
int age;
char sex[10];
char telephone[11];
};
结构体使用方法:
int main()
{
struct student s = {"张三",18,"男","0123456789"};
printf("name=%s\tage=%d\tsex=%s\ttelephone=%s\n", s.name, s.age, s.sex, s.telephone);
return 0;
}
注:. 为结构成员访问操作符,使用前提为使用对象必须为结构或联合类型
还有一种方式适用于指针变量:
int main()
{
struct student s = {"张三",18,"男","0123456789"};
struct student* p;
p = &s;
printf("name=%s\tage=%d\tsex=%s\ttelephone=%s\n", s.name, s.age, s.sex, s.telephone);
printf("name=%s\tage=%d\tsex=%s\ttelephone=%s\n", p->name, p->age, p->sex, p->telephone);
return 0;
}
注: -> 为指针变量操作符,适用对象必须为指针变量。
至此C语言入门学习最终篇完结,如果有什么问题,欢迎大家在评论区,讨论、指正。
也希望此文对于你能够有所帮助,谢谢大家~
码字不易,还望支持