Men的博客

欢迎光临!

0%

C语言数组、指针和结构体

一 数组及其特性

1)数组的3要素
类型名 数组名[数组元素个数]
(1)类型名:char ,int ,float, double,char * ,int *,float *,double 等等
(2)数组名:只要符合c语言标识符规范即可。
(3)数组元素个数:可以使常量,比如4,5等只要能够有确定值的表达式就可以
2)声明一个有10个整型元素的数组
int arr[10]; <==> int arr[2
5];
声明一个有10个字符元素的数组
char str[10];
其他类型,如float,double,char *,int *,float *,double *以此类推
3)整型数组初始化
(1)完全初始化(2)部分初始化
除了被初始化的元素是有确定的值,未被初始化的元素被系统设置为数值0
例如:int arr[10]={1,2,3,4};
这时该数组的10 个元素依次为:1,2,3,4,0,0,0,0,0,0
特例,极端的部分初始化,如int arr[10]={};这种用法很常见,数组所有元素
被系统设置为0 7
指定初始化,如int arr[10]={[1]=4,[2]=5};相当于把下标为1的元素初始化为4
把下标为2的元素初始化为5,未被初始化的元素被系统自动设为0
(3)其他类型的初始化也都遵循上述原则
注意:数组只有在初始化的时候可以整体赋值,单就赋值而言数组是不能被整体赋
值的
4)整型数组元素的引用
数组下标是从0开始的,数组名字[n],这个相当于数组第n+1个元素
如int arr[10]={1,2,3,4,5,6,7,8,9,0};
arr[0]=1
arr[2]=3
arr[9]=0
数组下标是有范围的,还用上面的例子,显然数组的下标是0~9
int arr[100]; 下标是0~99
int arr[4]; 下标范围是0~3
如果引用数组元素时,下标超过了其表达范围,编译器在编译的时候是不会报错的,
但是执行结果时不确定,即有可能符合正确结果,或者直接报内存错误,总之结果
都是错误的,或者说是程序都是错误的。
一般习惯管超过下标所能表达范围时叫做越界,越界的程序结果是不可预测的。保
证程序不越界是程序员的责任。
5)数组名字:数组的名字是一个常量,即首元素的地址。
6)数组存储特性:
数组元素的地址在内存存储时是连续的。

二 指针(间接访问)

指针即内存地址,硬件厂商在做内存的时候,都是按照一定规律来制作内存的内存可以抽象为一排即有门牌号,又满足一个门牌号对应一个大小确定的存储空间。而作为门牌号的地址都是特殊的常量(4G大小内存可以表示的范围是0x0~0xffff ffff ffff ffff),而专门存储这些常量的变量被称为指针变量
注意:指针变量与普通变量的区别是指针变量存储的值只能是地址常量
1)type * 指针变量名(声明了type类型的一个指针);
(1)类型:可以是基本数据类型,例如,char ,int ,float,double
也可以是构造类型,例如:struct student ,union mydir等等
(2)指针变量名:符合c语言标识符规范
(3)指针变量所占内存大小
2)声明一个整型指针
int *p;
int * 是一个类型,即整型指针类型。
p是一个变量,对应的有它自己所占用内存。而p既然是一个指针变量,那么
该指针变量所存储的值是一个地址,而且只能是一个地址。
例如:
int n=10;
int *p=&n; //与一个数据类型共同构成指针类型,仅仅只是一个标识符号
p=5; //在这里是一个间接取值运算符
//n=5;
通过指针途径修改一个变量的值,效率不如直接通过变量名修改。因为前者还牵涉到一个间接取值的运算。这里仅仅只是为了讲解指针的用法,仅仅修改变量的值显然不是指针的主要用法,指针的主要用法是可以指向内存地址或者说是在允许范围内指针可以自由的操作自己的内存空间。
注意:在声明一个指针变量的过程中所用的
与通过指针间接取用数值时候的
意义是不同的。后者是一个间接取值运算符,而前者充其量仅仅只是一个类型说明符的一部分。

三 结构体

1)结构体声明(结构体模板)
#define LENGTH 20
struct book
{
char name[LENGTH] ;
char author[LENGTH];
float price;
int edition;
};
注意:程序在运行的时候,结构体模板是不占内存的
2)声明结构体变量:结构体关键字+结构体名字=结构体类型名字
struct book 是一个结构体类型,那么声明一个结构体变量如下:
struct book my_book;
my_book就是一个结构体变量,他是有对应的内存空间的,其实这个结构体是关于一本书的信息描述,并且有自己的内存空间,可以把这个变量当成一个对象。结构体变量所占内存大小并非是各个成员类型所占内存大小的和,需要通过sizeof运算符来进行测量。
struct book *book_pointer;
book_pointer是一个结构体指针变量,该指针变量只有存储一个内存地址
大小的空间
3)结构体成员访问
结构体成员访问方法与数组引用元素有些类似。数组是通过下标来引用对应的元素,而结构体是通过模板中的成员名字来引用。
引用的时候可以如下:
结构体变量引用成员和(.)运算符
struct book my_book;
my_book.name
my_book.author
my_book.price
my_book.edition
结构体指针引用成员和(->)运算符
struct book *book_pointer;
book_pointer->name
book_pointer->author
book_pointer->price
book_pointer->edition
数组是同种类型数据的集合,而结构体是各种类型数据的集合