C语言:const关键字、结构体
2015-08-24 10:31
447 查看
前几节内容的讲解,主要是内存地址及指针的分析。这一节讲解一下容易混淆的关键字constant及结构体的知识。
一、const关键字
1. 字符常量的指针
因此,p1++ 这个操作是可以的,打印结果如下:
指针的值:0x100000f22,指针所指向的值:h
指针的值:0x100000f23
我们再来试着书写 (*p1)++; 这个操作。首先通过 *p1 操作获得字符串 "hello" 中的 h, 然后进行 "++" 操作,然而此时,"hello" 是只读的,所以这句代码在编译期间就会报错了。
2. 字符的常量指针
打印结果:
指针的值:0x100000f64,指针所指向的值:w
我们再来试着书写 p2++; 这个操作。此时在编译期间就会报错,因为 p2 是只读的。
*p2 = 'k';这个操作在编译期间不会报错,所以不违反"指针指向的值可以被修改"这一规则,但是它会在运行期间报错,因为字符串"world" 是存储在只读存储区的。
二、 结构体
在C中,使用结构体可以把不同类型的值存储在一起,因此结构体是一些值的集合,这些值称为它的成员。在数组中可以通过下标访问,只是因为数组的元素长度相同。而结构体是不可以的,所以在结构体中,每个成员都有自己的名字,他们是通过名字访问的。
结构体的申明
方式一:基本声明
第一个结构声明创建了一个名字叫x得变量,它包含三个成员:一个整数,一个字符和一个浮点数。
第二个结构声明创建了y和z,y是一个数组,它包含了20个结构。z是一个指针,它指向这个类型的结构。
但是,这两个声明被编译器当做两种截然不同的类型,即使它们的成员列表完全相同,因为 z = &x; 是错误的写法。
方式二:标签声明
方式三: typedef声明
结构体的使用
定义如下结构体
结构Ex2中有一个整形成员和一个short数组;结构Ex中有一个整形成员,一个字符数组,一个Ex2结构,一个指向Ex结构的指针变量。
下面,对他们进行初始化工作
1. 结构体.变量名
2. 指针名->变量名
获取结构中成员变量的地址(注意:这里打印的地址虽然和px的地址一样,但是含义不同:px表示整个结构的地址,而&px->a表示结构x中变量a所在的地址;由于变量a是结构的首元素,所以和整个结构的地址是一致的)。
一、const关键字
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++ 入门教程(一) 写C++前的准备
- 详解C语言中的错误报告errno与其相关应用方法
- c++ 设计模式之简单的工厂模式
- hdu1013-简单模拟
- c++11 mutex ,lock 和 condition_variable 的使用用简介
- C++ 与C
- POJ C++程序设计 编程题#3 编程作业—运算符重载
- 再论C语言指针—对指针的理解
- 开方.cpp
- C语言之位运算
- 《effective C++》:条款37——绝不重新定义继承而来的缺省参数值
- C++中头文件相互包含
- C语言的低级运算
- C++整理1
- C++语言的getline在cl和g++中的不同语义
- C++用多种方式实现Singleton单例模式
- 【C语言】预处理指令—条件编译
- C++: 安装minGW,Msys;对接NeatBeans IDE
- C++正则表达式
- C++ 的那些坑 (Day 2)