- 初识指针、初始结构体学习小结
一、内存
二、指针
- (一)为何要用指针;指针有什么作用
- (三)指针变量大小
三、结构体
一、内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
对于32位计算机来说,一共拥有32根地址线,即“1”或“0”的交替显示。
(电信号转换成数字信息,即二进制序列)
例如:
2的32次方个序列每一个对应一个内存单元,2的32次方转换为十进制为:4,294,967,296
一个内存单元所占大小是一个字节,即1Byte。
4,294,967,296 byte = 4,194,304 kb = 4,096 mb = 4 gb 因此一个32位计算机可以存储4gb 的内存。
同理可以计算出64位机器的内存。
二、指针 (一)为何要用指针;指针有什么作用
有上面可知,一个内存单元占据一个字节,如果初始化一个变量 ‘a’,那它会占据4个内存单元。
#include
int main()
{
int a = 1;
printf("%zu", sizeof(a));
return 0;
}
地址以十六进制表示,‘a’ 一共对应四个字节,但是以第一个数字为a的序号,a的四个字节对应的每一个都有对应数:
那么如何打印出‘a’的地址呢:
这里需要用到“%p”作为取地址的符号:
#include
int main()
{
int a = 1;
printf("%p", &a); //不同编译器,不同时期打印结果不同
return 0;
}
那么如果想让"&a"存起来该如何呢?
// P = &a; 这一步是把&a存放在P里。
// 那P的类型是什么呢? P里装的是地址,因此P是一个指针变量。
int * P = &a;
#include
int main()
{
int a = 0;
int * p = &a;
*p = 20; //这里的“*”是解引用 *** 作符,这里用int是因为a是整型, *说明P是指针变量,p是通过 *p 找到a的值。
printf("%d",a);//注意,* 和p不是一组的。
return 0;
}
结果:a 的值被改成了20,因此,可以通过指针变量反过来改变a的值。
#include
int main()
{
int s = 6;
int* P = &s; //这里用int是因为s是整型, *说明P是指针变量,p是通过 *p 找到a的值。
//而其中 p 取值是取 s 四个字符的第一个地址。
printf("%d\n", P);//结果可以看出P与&s结果相同。
printf("%p", &s);
return 0;
}
(三)指针变量大小
分为32位和64位机器:
- 32位机器:
#include
int main()
{
printf("%zu\n", sizeof(char*));
printf("%zu\n", sizeof(short*));
printf("%zu\n", sizeof(int*));
printf("%zu\n", sizeof(long*));
printf("%zu\n", sizeof(long long*));
printf("%zu\n", sizeof(float*));
printf("%zu\n", sizeof(double*));
return 0;
}
三、结构体
要用到关键字 ”struct“。
结构体可以让C语言创建出新的类型;
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如:描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
这里只能使用结构体来描述了。
#include
struct Stu
{
char name[20] = {0};//初始化,名字是字符串
int age = 0;
char sex[10] ={0};
char number[15] = {0};
}
int main()
{
struct Stu s = {"人",18,”男“,”2020123“} //结构体的创建和初始化
printf("name=%s age=%d sex=%s number=%s",s.name, s.age, s.sex, s.number)
return 0;
}
那么用指针怎么表示呢?
#include
struct Stu
{
char name[20];//初始化,名字是字符串
int age;
char sex[10];
char number[15];
};
int main()
{
struct Stu s = { "人",18,"男","2020123"};
printf("name=%s age=%d sex=%s number=%s\n", s.name, s.age, s.sex, s.number);
struct Stu* P = &s;
printf("name=%s age=%d sex=%s number=%s\n", (*P).name, (*P).age, (*P).sex, (*P).number);//这里的(*P)对应s里的位置
printf("name=%s age=%d sex=%s number=%s", P->name, P->age, P->sex, P->number);
return 0;
}
这里的学习也补充了之前初始 *** 作符的部分内容,分别是‘.’和‘—>’,其中‘.’两端分别是结构体变量和成员变量, ‘—>’两端分别是结构体指针和成员变量名。
以上就是这次学习的小结,有不当之处还请各位大佬多指正。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)