【C语言】回炉重造的C之指针+结构体

简介: 【C语言】回炉重造的C之指针+结构体

【C语言】C——指针和结构体(1)

一、指针到底是个什么牛马?

1.说指针之前先来了解下——内存

2.内存用来干什么

3.指针

二、指针怎么使用

* ——解引用操作符

三、指针的大小

四、结构体

总结

——已经是第二次学C语言了,第一次学就是在指针这块遇到了问题,现在回过头再来学习,还是有必要自己整理一些干货的


****不是详细版本 ------仅方便理解****

一、指针到底是个什么牛马?

1.说指针之前先来了解下——内存

20210610182228158.png


由于我们的电脑有32位/64位两种,拿32位来举例子

32位——32根地址线(也就是电线,给他们通电,产生0/1)

于是乎就会产生

00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000100
00000000000000000000000000001000
。。。
11111111111111111111111111111111


这种32个一串的地址一共有2^32 个也就是2^32 个bit,而1个字节=8bit,所以就会有(2^32)/8个内存单元


2.内存用来干什么

当然是用来存东西,举个栗子

20210610182955784.png


然后呢,假设这4个字节的内存空间编号为501 502 503 504


20210610185950203.png

问题来了,那a到底是哪个格子呢?让代码运行起来用监视器查看一下


20210610191725663.png

19cf2e3da5b749ad8db647c4e486bb58.png


监视器一查看就会发现&a取到的其实是第一个字节的地址,同时还发现,取地址是从低地址往高地址取的(从第一位往后,因为只要找到了第一位,后面的就依次+1即可),也就是如图


20210610192221273.png

3.指针

接着上边,将a的地址给它打印出来,这里注意一个问题,因为每次的内存都是重新分配的,所以每一次打印出来的地址是不一样的

20210610192933599.png

指针的定义


&    取地址操作符``
a     整型变量
&a 对a取地址  即   &a表示a的地址
p=&a把一个地址放进p中,地址=指针,所以p是一个指针变量
定义一个指针变量的语法为:int *p=&a;

20210610211749188.png

为什么要这样定义

20210610213210989.png


举个栗子


char ch = 'w';//ch是个char类型变量
char* p = &ch;//所以要用char*


地址和变量的关系请看图

20210610215316296.png

存放10的地址就是指针,地址就好比你家门牌号 即————地址=指针


20210610220445799.png

二、指针怎么使用

* ——解引用操作符

要想使用指针,就要用到解引用操作符,也就是 “ * ”号


int a =10;//先把10赋值给a
int* p=&a;//把a的地址存于指针p
 *p=20;//通过使用解引用操作符,通过a的地址找到a,把20赋给a
 printf("%d\n",a);//打印出来的a就是20


三、指针的大小

打印出各种类型的指针的长度


#include <stdio.h>
int main()
{
  printf("%d\n", sizeof(char*));
  printf("%d\n", sizeof(short*));
  printf("%d\n", sizeof(int*));
  printf("%d\n", sizeof(long*));
  printf("%d\n", sizeof(float*));
  printf("%d\n", sizeof(double*));
  return 0;
  }


运行结果为

20210610223103821.png

为什么全都是4,那是因为在32位的机器上,一个内存单元的大小为1byte=8bit,而4个字节(byte)=32个bit,上栗子``


00000000000000000000000000000001//这是一个32位地址
而char* short* int* long* float* double* 定义的是一个指针变量
指针变量里存放的也就是一个地址,所以说只要是地址,就是4个字节(64位的电脑,则为8个字节)
地址大小只取决于平台


四、结构体

一个复杂对象,栗如:

学生:

名子+年龄+性别+身高

—————————————————————————————————————

当遇到这种对象时,基本类型已经无法表示,这时候就需要用到结构体


#include <stdio.h>
struct Student//声明一个学生类型
{
   char name[20];
   int age;
   char sex[5];
   char id[12];
};//注意这里还有个分号不要忘了
int main()
{
//创建结构体变量
struct Student s1={"张三",20,"男","20200506"};
struct Student s1={"李四",20,"女","20200506"};
return 0;
}


语法格式就是这个样子,依葫芦画瓢,用就完了

结构体变量如果要访问成员变量,就要用 “.”操作符


printf("名字:%s 年龄:%d 性别:%s 学号:%s", s1.name, s1.age, s1.sex, s1.id);//即可访问并打印各个成员变量

同样,可以用指针来访问变量成员

struct Student*p=&s1;
printf("名字:%s 年龄:%d 性别:%s 学号:%s", (*p).name, (*p).age, (*p).sex, (*p).id);
printf("名字:%s 年龄:%d 性别:%s 学号:%s", p->name, p->age, p->sex, p->id);


两种方法都是可以的,都一样

“.”————————结构体变量.成员名

“->”————————结构指针->成员名


总结

本篇只对指针和结构体做简单介绍,方便理解为主,欢迎指出错误


相关文章
|
1月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
103 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
1月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
166 14
|
1月前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
196 10
|
1月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
85 9
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
52 7
|
2月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
215 13
|
2月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
86 11
|
2月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
76 11
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。