前几节内容的解说,主要是内存地址及指针的分析。这一节解说一下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是结构的首元素。所以和整个结构的地址是一致的)。

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

  1. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

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

    关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...

  3. 01.C语言关于结构体的学习笔记

    我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...

  4. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  5. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...

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

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  7. go语言学习-结构体

    结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...

  8. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  9. [日常] Go语言圣经--结构体,JSON习题

    Go语言圣经-结构体 1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体 2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行 ...

  10. Go语言中结构体的使用-第2部分OOP

    1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...

随机推荐

  1. java实例化对象的五种方法

    1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反射手段,调用java.lang.Cla ...

  2. 创业笔记-Node.js入门之一个完整的基于Node.js的web应用

    用例 我们来把目标设定得简单点,不过也要够实际才行: 用户可以通过浏览器使用我们的应用. 当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单. 用户可 ...

  3. 深入分析Java中的I/O类的特征及适用场合

    Java中有40多个与输入输出有关的类.假设不理清它们之间的关系.就不能灵活地运用它们. 假设从流的流向来分,可分为输入流和输出流,而输入流和输出流又都可分为字节流和字符流.因而可将Java中的I/O ...

  4. ubuntu 交叉编译qt 5.7 程序到 arm 开发板

    ubuntu 交叉编译qt 5.7 程序到 arm 开发板平台1 ubuntu 12.042 arm-linux-gcc 4.5.13 QT 5.74 开发板210 armcortex-A8 一 概述 ...

  5. nyoj--2--括号配对问题(栈函数)

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100), ...

  6. Kettle学习系列之Kettle的起源

    不多说,直接上干货! Kettle起源于十年以前,本世纪初.当时啊,ETL工具千姿百态,比较流行的工具有50个左右,ETL框架数量比工具还要多些. 根据这些工具的各自起源和功能可以分为以下4种类型,如 ...

  7. hdu 1257/1800 - 贪心,dp

    1257题目链接 一个序列划分子序列,每个子序列都是非增序列,问最少分成几个子序列 1800题目链接 一堆数分组,每组内数据严格递减,问最少分几组 -------------------------- ...

  8. pic16F1938

    1.中断自动保存寄存器:W.STATUS.BSR.FSR和PCLATH,而且如果中断中需要改变这些寄存器,在Bank31中修改这些寄存器的影子寄存器即可. 2.RAM有1024字节,分为N个bank, ...

  9. POJ 2386 Lake Counting【BFS】

    题意:给出一个矩形,问有多少块连通的W 当找到W的时候,进行广搜,然后将搜过的W变成点,直到不能再搜,进行下一次广搜,最后搜的次数即为水塘的个数 看的PPT里面讲的是种子填充法. 种子填充算法: 从多 ...

  10. Codeforces Round #289 Div 2

    A. Maximum in Table 题意:给定一个表格,它的第一行全为1,第一列全为1,另外的数满足a[i][j]=a[i-1][j]+a[i][j-1],求这个表格中的最大的数 a[n][n]即 ...