『C语言入门』第一章-初识C语言(6)

目录

 

1.指针

   1)地址

   2)指针变量

2.结构体


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语言入门学习最终篇完结,如果有什么问题,欢迎大家在评论区,讨论、指正。

也希望此文对于你能够有所帮助,谢谢大家~

码字不易,还望支持

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值