C语言:constkeyword、结构体

前几节内容的解说,主要是内存地址及指针的分析。这一节解说一下easy混淆的keywordconstant及结构体的知识。

一、constkeyword

1. 字符常量的指针

char const *p1 = "hello";
printf("指针的值:%p,指针所指向的值:%c\n",p1, *p1);
p1++;
printf("指针的值:%p,\n",p1);

上例中。p1就是字符常量的指针,它的特点: 指针的值能够被改动。指针所指向的值不能被改动。

因此。p1++ 这个操作是能够的,打印结果例如以下:

指针的值:0x100000f22,指针所指向的值:h

指针的值:0x100000f23

我们再来试着书写 (*p1)++; 这个操作。首先通过 *p1 操作获得字符串 "hello" 中的 h, 然后进行 "++" 操作,然而此时,"hello" 是仅仅读的,所以这句代码在编译期间就会报错了。

2. 字符的常量指针

char *const p2 = "world";
printf("指针的值:%p,指针所指向的值:%c",p2, *p2);

上例中,p1就是字符的常量指针。它的特点: 指针的值不能够被改动,指针指向的值能够被改动。

打印结果:

指针的值:0x100000f64,指针所指向的值:w

我们再来试着书写 p2++; 这个操作。此时在编译期间就会报错,由于 p2 是仅仅读的。

*p2 = ‘k‘;这个操作在编译期间不会报错,所以不违反"指针指向的值能够被改动"这一规则,可是它会在执行期间报错,由于字符串"world" 是存储在仅仅读存储区的。

二、 结构体

在C中,使用结构体能够把不同类型的值存储在一起,因此结构体是一些值的集合,这些值称为它的成员。

在数组中能够通过下标訪问。仅仅是由于数组的元素长度同样。

而结构体是不能够的,所以在结构体中,每一个成员都有自己的名字,他们是通过名字訪问的。

结构体的申明

方式一:基本声明

struct {
    int a;
    char b;
    float c;
} x;

struct {
    int a;
    char b;
    float c;
} y[20], *z;

第一个结构声明创建了一个名字叫x得变量。它包括三个成员:一个整数,一个字符和一个浮点数。

第二个结构声明创建了y和z,y是一个数组,它包括了20个结构。z是一个指针,它指向这个类型的结构。

可是。这两个声明被编译器当做两种截然不同的类型。即使它们的成员列表全然同样,由于 z = &x; 是错误的写法。

方式二:标签声明

struct SIMPLE {
    int a;
    char b;
    float c;
};

标签同意多个声明使用同一个成员列表。

这个声明把标签SIMPLE和这个成员列表联系在一起。该声明并没有提供变量列表,所以它并为创建不论什么变量。

struct SIMPLE x;
struct SIMPLE y[20], *z;
z = &x;

而且此时 z = &x; 是全然能够的。由于x与z所指向的结构是同一种类型的结构。

方式三: typedef声明

typedef struct {
    int a;
    char b;
    float c;
} SIMPLE;

这个技巧和声明一个结构标签效果差点儿同样。差别在于Simple如今是个类型名而不是个结构标签。

所以兴许的声明可能像以下这个样子:

SIMPLE x;
SIMPLE y[20], *z;

结构体的使用

定义例如以下结构体

typedef struct {
    int a;
    short b[2];
} Ex2;

typedef struct Ex {
    int a;
    char b[3];
    Ex2 c;
    struct Ex *d;
} Ex;

结构Ex2中有一个整形成员和一个short数组;结构Ex中有一个整形成员。一个字符数组,一个Ex2结构,一个指向Ex结构的指针变量。

以下,对他们进行初始化工作

Ex x = {10, "Hi", {5, {-1 ,25} }, 0};
Ex *px = &x;

分析一下结果:

printf("px 存放的内容:%p\n",px);

px中存放的内容就是结构体x的地址。

Ex accept = *px;

*px就是获取px所指向的整个结构体的值。

printf("结构x的变量a的值:%d,%d\n",x.a, px->a);

訪问结构体成员的两种方式:

1. 结构体.变量名

2. 指针名->变量名

printf("结构x的变量a的地址:%p", &px->a);

获取结构中成员变量的地址(注意:这里打印的地址尽管和px的地址一样。可是含义不同:px表示整个结构的地址,而&px->a表示结构x中变量a所在的地址。因为变量a是结构的首元素。所以和整个结构的地址是一致的)。

时间: 2024-10-13 01:46:56

C语言:constkeyword、结构体的相关文章

C语言的结构体和C++结构体的区别

关于C++中声明结构体中需要使用构造器创建实例对象的语法: 接着上两个代码截图你就初步体会到C语言的结构体和C++结构体的区别了:     对于右边的C++结构体的使用类似Java,C++,Swift中的类,类中有构造器方法,然后构造器创建这个类的实例对象. 当然Swift中也有一样用法的结构体.毕竟Swfit是集大家之所成的现代语言.

黑 马 程 序 员_视频学习总结<C语言>----05 结构体

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.什么是结构体 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型.为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的. 二.结构体的定义 结构体内部的元素,也就是

c语言的结构体字节数统计

struct结构体的字节数 等于 结构体中最大类型的字节数的倍数. 如:?typedef struct Student{??? short id; //2个字节??? char name[15]; //1*15个字节??? int age; //4个字节??? char num; //1个字节} Student; 总共28个字节. c语言的结构体字节数统计

C语言的结构体和 C++结构体的区别

 C语言的结构体和 C++结构体的区别 关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的初始化方法> 接着下面两个代码截图(一个是C源码,一个是C++源码)对比你就初步体会到C语言的结构体和C++结构体的区别了:      对于右边的C++结构体的使用类似Java,C++,Swift中的类,类中有构造器方法,然后构造器创建这个类的实例对象. 当然Sw

C语言之结构体

1 概述 结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型. 2 定义结构体类型变量的方法 定义结构体变量的一般格式为: struct 结构名 { 类型  变量名; 类型  变量名: ... }结构变量; 代码如下: struct Student{         char name[8];         int age;     }stu1; 上面的代码声明了一个名为Student的结构体,它包含两个成员name和age,成员name的数据类型为字符数组,成员ag

【剑仙教程】易语言的结构体。自定义数据类型。

1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言的IDE,IDE,是开发环境. 点击“插入”菜单,选择“数据类型” 这时,代码编辑框就会增加一个数据类型的窗口. 把“数据类型1”命名为“精易_座标”,勾选“公开项”. 这样,一个 精易_座标 的类就做好了. . 再按回车键,给这个类增加2个成员. x 整数型 y 整数型 . 访问时,直接写代码就O

黑马程序员---C语言基础---结构体

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ C语言基础---结构体 一.什么是结构体 介绍结构体之前,我想先简单介绍下数组.我想大家对数组都再熟悉不过了,顾名思义,数组就是将一些数据(元素)组合在一起,作为一个整体.使用数组需要注意的是这些元素必须是相同类型.而结构体和数组类似,也是将一些数据组合在一起作为一个整体,但是这些元素可以是不同类型.可以这么理解:结构体是更加灵活的数组,因为它允许元素是不同的类型. 实际生活中,如果我们要

C语言中结构体赋值问题的讨论(转载)

今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言中结构体赋值的问题吧: 结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //define two structs with three different field

c语言 struct结构体的变量声明加冒号

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可. 为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示. [1]定义: struct 位域结构名 { 位

C语言中结构体参数变量的传递

c语言  结构体  函数  参数  传递 一.前言 本文中的程序实现对员工信息结构体字段赋值并打印出来的功能.该结构体的定义如下: // 员工信息结构体 typedef struct {        INT8       szEmployeeName[100];     // 员工姓名        UINT16  iEmployeeAge;                    // 员工年龄        UINT32  iEmployeeNo;