Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言初阶(七) - 指针、结构体

C语言初阶(七) - 指针、结构体

作者头像
怠惰的未禾
发布于 2023-04-27 13:00:53
发布于 2023-04-27 13:00:53
52300
代码可运行
举报
文章被收录于专栏:Linux之越战越勇Linux之越战越勇
运行总次数:0
代码可运行

1. 指针

1.1 地址

计算机的内存中有许许多多的储存单元(大小为一个字节),这些储存单元都被进行了编号,每个储存单元都有唯一的编号,称之为储存单元的地址。

8bit(位) = 1byte(字节) 1024字节 = 1KB(千字节) 1024KB = 1MB(兆字节) 1024MB = 1GB 1024GB = 1TB 1024TB = 1PB 2^10 = 1024

  • 不同类型的变量都会储存在内存中,因此变量会有自己对应的地址,不同类型的变量在内存中所占的字节数有差异,一般以第一个字节的地址作为变量的地址

如何知道一个变量的地址呢?答案是取地址操作符&,可以取出变量的、函数的地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
int main(){
    int a = 1;
    printf("%p\n", &a);
    return 0;
}

取出变量a的地址,这个地址是随机分配的,所以每次运行程序得到的地址也不一定相同。

1.2 指针

  • 上面所说的地址又叫指针常量,是已经确定的,不可改变
  • 我们可以创建指针变量储存某个地址,代表着指针变量指向这个地址,一般可以改变储存的地址以此来指向不同的地址。
  • 一般指针变量可以简称为指针。
1.2.1 指针的定义:定义一个相应数据类型的指针变量

格式:数据类型 *变量名

1.2.2 指针的初始化:
  • 先定义再初始化
  • 在定义的同时初始化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 5;
int *p1 = NULL;
//p1是一个指针,指向int类型的数据
p1 = &a;

double b = 4.6;
//p2是一个指针,指向一个double类型的数据
double* p2 = &b;
1.2.3 指针变量的使用

以指向int类型的指针为例 指针变量可以指向一个变量的地址,如何通过指针变量影响(改变)指向的变量的值呢?通过解引用操作符*可以实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main(){
    int a = 0;
    int *p = &a;
    //解引用操作符,此时*p等价于a
    *p = 10;
    printf("%d\n", *p);
    
    return 0;
}
1.2.4 指针变量的大小

指针存放的是地址,所以指针变量的大小是地址的大小。 32位平台上(32个bit)大小是四字节,64位平台上(64个bit)大小是八字节。

2. 结构体

C语言除了有基本的数据类型外,还可以借助struct自定义数据类型,用来描述复杂的对象。 比如描述一个学生,需要姓名、学号、班级、成绩、身份证号等信息。

2.1 结构体的定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//一个学生所具有的基本信息
struct student{
    char name[10];
    char num[20];
    int class;
    int score;
    char id[20];
}

此时struct student就是一个自定义的数据类型,用法与charint等数据类型基本相同。

2.2 结构体的初始化

假设已经定义了struct student的数据类型

  • 只能在定义的同时初始化,而不能先定义再初始化

struct student a = {"xiaozhang","10001",1,95,"41XXXXXXXXXXXXXX"};

2.3 结构体的使用

  • 使用圆点操作符.访问一个结构体中的单个成员。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

struct student{
    char name[10];
    char num[20];
    int class;
    int score;
    char id[20];
};

int main(){
    struct student a = {"xiaozhang","10001",1,95,"41XXXXXXXXXXXXXX"};
    printf("%s %s %d %d %s", a.name, a.num, a.class, a.score, a.id);
    return 0;
}

运行结果:

  • 使用箭头操作符->访问结构体的单个成员,前提是一个结构体指针
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

struct student{
    char name[10];
    char num[20];
    int class;
    int score;
    char id[20];
};

int main(){
    struct student a = {"xiaozhang","10001",1,95,"41XXXXXXXXXXXXXX"};
    //这是一个指针,指向一个结构体变量
    struct student *p = &a;
    printf("%s %s %d %d %s", p->name, p->num, p->class, p->score, p->id);
    return 0;
}

运行结果:


END

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言结构体数组、指针与函数-学习二十八
本文最后更新于2022年02月24日,已超过4天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
XG.孤梦
2022/03/01
1.2K0
C语言结构体数组、指针与函数-学习二十八
[C语言]初阶指针和结构体
内存:内部存储器,暂存程序/数据——掉电丢失 SRAM,DRAM,DDR,DDR2,DDR3。
IT编程爱好者
2023/04/12
5760
[C语言]初阶指针和结构体
C语言入门系列之10.结构体和共用体
引入: 有时需要将不同类型的数据组合成一个有机的整体,以便于引用。 例如,一个学生有学号、姓名、性别、年龄、地址等属性,需要定义int num; char name[20]; char sex; int age; int char addr[30];等属性,如下:
cutercorley
2020/07/23
1.3K0
C语言入门系列之10.结构体和共用体
未禾的C语言总结
**************************************************************************************************************************************************************************************************************** 操作符解释:     1,算术操作符:         ‘+’、‘-’、‘*’、‘/’、‘%’         %取模操作符只能用于整数,         /除法操作符,两个操作数均是整数时为整数除法,有一个是浮点数则执行浮点数除法。         如:int a = 6/5;//->a==1             double b = 6/5;//->b==1.000000             double c = 6.0/5//->c==1.200000,即实际运算与定义的储存类型无关     2,移位操作符         左移‘<<’、右移‘>>’         左移操作符:             如:   int a=2;                 int b = a << 1;//a向左移动一位,结果存入变量b中,结果b为4             正整数2在内存中存放的补码为:                                00000000000000000000000000000010             向左移动一位,左边的首位0去掉,右边的缺一位补0:00000000000000000000000000000100 ->4(十进制)         右移操作符:             右移时分为算数右移和逻辑右移。             算数右移:右边丢弃,左边补符号位。             逻辑右移:右边丢弃,左边补0。             如:int a = -10;                    int b = a >> 1;//a向右移动一位,结果存入变量b中             正整数10在内存中的补码为11111111111111111111111111110110//若为负数则原码与补码不同。             算术右移:             11111111111111111111111111111011 ->-5             逻辑右移:             01111111111111111111111111111011 ->2,147,483,643         对移位操作符移动负数位,这时C语言未定义的,不要使用。     3,位操作符         按位与‘&’、按位或‘|’、按位异或‘^’         位解释为二进制的一位。         &按位与,全为1时结果才为1,其他情况结果均为0             如:int a = 3;//        00000000000000000000000000000011                    int b = 5;//        00000000000000000000000000000101                    int c = a & b;//    00000000000000000000000000000001->1(十进制)             eg:找出一个整数的二进制的1的个数。                 #include <stdio.h>                 int main(){                 int a=1;                 int cnt=0;                 for(int i=0; i<31; i++){                     if((a&1) == 1){//整数的二进制数的1的个数                          cnt++;                     }                     a=a >> 1;                 }                 printf("%d\n",cnt);                 return 0;             }          |按位或,全为0时结果才为0,其他情况结果均为1             如:int a = 3;//    000
怠惰的未禾
2023/04/27
5770
抽丝剥茧C语言(初阶 下)
如果到现在你也感觉有很多地方听不懂,没关系,我的这三篇博客只是让我们一起了解C语言大概是什么样子,对它有一个最初的了解就可以了,以后会有更详细的博客。
有礼貌的灰绅士
2023/03/28
3090
抽丝剥茧C语言(初阶 下)
C语言 | 结构体指针
在C语言中,指向结构体对象的指针变量既可以指向结构体变量,也可指向结构体数组中的元素。
小林C语言
2021/05/06
2.3K0
C语言 | 结构体指针
C语言之精华——指针详解(上)
这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以我想通过一篇文章来尽可能的讲解指针,以对得起这个文章的标题吧。本文会持续更新。
C语言中文社区
2022/05/30
7220
C语言之精华——指针详解(上)
C语言结构体指针_C语言函数返回结构体指针
问题定义:有时需要将不同类型的数据组合成一个有机的整体,以便于使用,就类似于sql中的存储一样,随着语言层次的增高封装性是越来越大的。如:
全栈程序员站长
2022/11/01
4K0
C语言结构体指针_C语言函数返回结构体指针
【数据结构&&C语言】【入门】【首次万字详细解析】入门阶段数据结构可能用到的C语言知识,一章让你看懂数据结构!!!!!!!
数组的定义其实非常非常简单;他就是是一组相同类型的集合,不理解也没关系,我给你举个例子就好了。
用户11367452
2024/11/21
2840
【数据结构&&C语言】【入门】【首次万字详细解析】入门阶段数据结构可能用到的C语言知识,一章让你看懂数据结构!!!!!!!
全国二级C知识点总结6-结构体、链表、共用体
l 类型定义形式: typedef 旧类型名 新类型名;(例如:typedef double D ; )
用户6755376
2019/12/02
1K0
C语言详解(六) - 结构体
数组是一类具有相同类型变量的值的集合。结构体是一些值的集合,这些值也叫成员变量。成员变量可以是不同类型的变量。
怠惰的未禾
2023/04/27
2370
C语言详解(六) - 结构体
C语言指针详解(文末有福利)
假如我们定义了 char a=’A’ ,当需要使用 ‘A’ 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 a( char 类型)只占了一个字节,指针本身的大小由可寻址的字长来决定,指针 p 占用 4 个字节。
C语言与CPP编程
2020/12/02
5740
C语言指针详解(文末有福利)
一万六千字详解C语言struct 结构体与 union 共用体
struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象。例如,描述学生的综合信息时,需要使用学生的学号、姓名、性别等不同类型的数据时,像这种数据类型总是在一起出现,那么我们不如把这些变量装入同一个“文件夹”中,这时用的关键字struct声明的一种数据类型就是表示这个“文件夹”的使用。那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。
C语言中文社区
2022/11/08
2.3K0
一万六千字详解C语言struct 结构体与 union 共用体
江哥带你玩转C语言 | 14 - 结构体-枚举-共用体
struct Student { int age; struct Student stu; };
极客江南
2021/07/11
8250
C 语言指针详解
假如我们定义了 char a=’A’ ,当需要使用 ‘A’ 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 a( char 类型)只占了一个字节,指针本身的大小由可寻址的字长来决定,指针 p 占用 4 个字节。
C语言与CPP编程
2020/10/17
2.6K0
C 语言指针详解
C语言知识总结——宏,枚举,结构体,共用体
以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问 。它的常量值只能是字符串或数字。 该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。
C语言与CPP编程
2021/04/30
2.6K0
C语言结构体
系统提供的类型:int double float char long 数组,指针...
岳泽以
2022/10/26
2.2K0
C语言结构体
C语言基础(4)
函数的作用是:定义一个函数,在进行多次复杂计算时可以直接引用过来,避免函数的复杂冗长,节省内存和时间。简单来说就是:简化代码,代码复用。下面举一例子:
see.
2024/06/04
1790
C语言基础(4)
C语言指针详解
这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以我想通过一篇文章来尽可能的讲解指针,以对得起这个文章的标题吧。
用户7886150
2020/12/14
2.4K0
C语言链表-学习二十九
本文最后更新于2022年02月24日,已超过3天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
XG.孤梦
2022/03/01
3380
C语言链表-学习二十九
推荐阅读
相关推荐
C语言结构体数组、指针与函数-学习二十八
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验