这里主要是记录一些我学习C语言中的一些知识点或个人思考过程
目录
1.结构体和结构体数组声明及访问
1.1 结构体声明方式及搭配使用
// 1
//struct+标识符
//你可以类比,把struct+标识符当成int使用,即:struct+标识符==int
//我们常用:int a;同理这里:struct+标识符 a;
struct a
{
int i;
float j;
char arr[10];
};
//此时还未定义这种结构体的变量
//常搭配:下面使用,定义了一个变量A;
struct a A;
// 2
//struct+标识符+末尾变量
struct b
{
int i;
float j;
char arr[10];
}B;
//此时在定义结构体的同时定义了这种结构体变量B
//常搭配:下面使用,定义了一个变量BB,BB和B是存储在不同的位置空间上,是相互独立的;
struct b BB;
//3
//用typedef 进行声明定义
//常用:typedef + struct +(标识符)+尾巴上的替代变量;
//例如:
typedef struct a
{
int i;
float j;
char arr[10];
} B;
//或者:
typedef struct
{
int i;
float j;
char arr[10];
} B;
//两者是等价的,常搭配下面使用:
B name;
1.2 数组结构体指针
数组名本身不是结构名,它是一个数组名,该数组中的每个元素都是定义结构题的结构变量
// 1
//struct+标识符,此时还未定义这种结构体的变量
struct a
{
int i;
float j;
char arr[10];
};
//常搭配:下面使用,定义了一个结构体数组A;
struct a A[10];
//使用:
A[0].i = 8;
// 2
//struct+标识符+末尾变量
struct b
{
int i;
float j;
char arr[10];
}B;
//此时在定义结构体的同时定义了这种结构体变量B,同时下面定义一个结构体数组BB
struct b BB[10];
//3
//用typedef 进行声明定义
//常用:typedef + struct +(标识符)+尾巴上的替代变量;
//例如:
typedef struct a
{
int i;
float j;
char arr[10];
} B;
//或者:
typedef struct
{
int i;
float j;
char arr[10];
} B;
//两者是等价的,常搭配下面使用:
B name[10];
2.结构体指针及结构体数组指针声明及访问
2.1 声明和初始化结构体指针
gets(),有1个输入量,字符串存储地址,有返回值,对换行输入进行丢弃
// 1
struct a
{
int i;
float j;
char arr[10];
} barney;
//定义结构体指针:
struct a *name;
//指针name就是指向一个结构体:
//该声明并未创建一个新的结构,但是指针name现在可以指向任意现有的
//a类型的结构。a例如,如果barney是一个a类型的结构,可以这样写:
name = &barney;
//以下等价
barney.i==name->i==(*name).i;
//.运算符比*运算符的优先级高,所以加括号
2.2 声明和初始化结构体数组指针
和数组不同的是,结构名并不是结构的地址,因此要在结构名前面加上&运算符,在本例中,A是一个结构数组,这意味着 A[0]是一个结构。所以,要让 结构体指针ptr指向A[0],可以这样写
// 1
//struct+标识符,此时还未定义这种结构体的变量
struct a
{
int i;
float j;
char arr[10];
};
struct a *ptr;
//常搭配:下面使用,定义了一个结构体数组A;
struct a A[10];
ptr=&A[0];
//常见使用:
ptr->i = 8;//等价于(*ptr).i=8
(ptr + 1)->i = 9;//等价于(*(ptr+1)).i=8
printf("%d,%d", A[0].i, A[1].i);
顺带一提,在有些系统中,一个结构的大小可能大于它各成员大小之和。这是因为系统对数据进行校准的过程中产生了一些“缝隙”。例如,有些系统必须把每个成员都放在偶数地址上,或4的倍数的地址上。在这种系统中,结构的内部就存在未使用的“缝隙”
3.向函数传递结构体信息
3.1 传递结构体成员
函数的参数把值传递给函数。每个值都是一个数字——可能是int类型、float类型,可能是ASCII字符码,或者是一个地址。然而,一个结构比一个单独的值复杂,所以难怪以前的C实现不允许把结构作为参数传递给函数,当前的实现已经移除了这个限制,ANSI C允许把结构作为参数使用。所以程序员可以选择是传递结构本身,还是传递指向结构的指针。如果你只关心结构中的某一部分,也可以把结构的成员作为参数
3.2 向函数传递结构体地址
注意下列程序的写法及程序中的问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 把这个结构体放进main函数块中会出现什么错误?
struct founds
{
int i;
int j;
};
// 下面这条语句放在结构体声明上面会出现什么错误?
int summ(const struct founds *);
int main()
{
int res = 0;
// 为什么不写成下面的版本?会出现什么错误?
// 是不是没有提前对其进行初始化?
// struct founds *MONEY;
// MONEY->i = 10;
// MONEY->j = 20;
// res = summ(MONEY);
// printf("%d", res);
// return 0;
struct founds money;
struct founds *MONEY;
MONEY = &money;
MONEY->i = 10;
MONEY->j = 20;
res = summ(MONEY);
printf("%d", res);
return 0;
}
int summ(const struct founds *a)
{
int i = 0;
i = (a->i + a->j);
return i;
}
3.2 向函数传递结构体
传递结构体,把上述的结构体指针换成结构体就可以了,不过在函数中的操作就变成了结构体的操作
4.参考链接
参考链接:C语言结构体全