初识指针、初始结构体学习小结

初识指针、初始结构体学习小结,第1张

初识指针、初始结构体学习小结

文章目录
  • 初识指针、初始结构体学习小结

    • 一、内存


    • 二、指针

      • (一)为何要用指针;指针有什么作用
      • (三)指针变量大小

    • 三、结构体


一、内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。


所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是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位机器:

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

这里的学习也补充了之前初始 *** 作符的部分内容,分别是‘.’和‘—>’,其中‘.’两端分别是结构体变量和成员变量, ‘—>’两端分别是结构体指针和成员变量名。



以上就是这次学习的小结,有不当之处还请各位大佬多指正。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存