C程序设计学习(十四)

strcat(s,s);会发生内存重叠,处理方法先将.src拷贝到buffer中,在进行连接。

一、指针数组和指向指针的指针

1.1定义

一维指针数组定义:  类型名 * 数组名 [数组长度]:

指向指针的指针:类型名 **p;

1.2指针数组作main函数的参数

命令行的一般形式为

此外,指针的指针还可作为函数的返回值和各种函数的参数,在使用时要注意变量中存放的到底是变量的地址还是指针地址的地址,判断清楚后再搭配*使用。

二、结构体和共用体

  .  结构体成员运算符        ->指向结构体成员运算符

2.1声明、定义和初始化

2.1.1结构体和各成员的声明

一个结构体类型的一般形式为:

struct    结构体名

{  成员表列  };   成员表列中对各成员进行类型声明:类型名  成员名;

2.1.2结构体类型变量的定义

在定义结构体类型变量时,有三种方法:1)先声明结构体类型再定义变量名;

eg:struct student  s1,s2;

2)在声明类型的同时定义变量

3)直接定义结构体类型变量(不写结构体名)

这样定义的好处是防止其被修改,缺点是后续不能继续添加变量。

2.1.3结构体变量初始化:

关于结构体类型,有几点要说明:
(1)类型与变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。

(2)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。
(3)成员也可以是一个结构体变量。

2.2结构体变量的引用

两种办法1)使用结构体成员运算符 .

一般形式:结构体变量名 . 成员名   eg:student1 . num = 100;student1.birthday.month;

2)通过地址引用

struct Student *a;a = &student1;a->name 或者(*a) . name。

2.3内存对齐

所有的数据被存放的首地址一定能被4整除。

1)到结构体成员中去查找最长的元素,最终按该元素长度对齐(结构体的最终大小能够整除这个数);

2)每个结构体成员所处的位置(偏移量)必须能够整除该成员的字节数。

3)最多按cpu位数(32位为4字节)

eg;student1中依次定义了char c;int t; short n;其占12个字节。

01234567891011
cttttnn

  若顺序是char c;short n;int t;其占8个字节。

01234567
cnntttt

这样做会牺牲空间,但会节约时间,让程序更高效。

2.4用结构体变量和指向结构体的指针作函数参数

用结构体变量作实参,用的时值传递的方式,若结构体中定义了很多成员,规模较大,在此基础上用结构体变量作实参会占用很多内存空间,因此很少使用该方法,常用指向结构体的指针代替,这样仅仅复制了它的地址,仅占八个字节,大大节约了空间的占用。

这里仅以打印函数举例。

void printStudent(struct Student *p)
{
    printf("%d %s %f\n",p->id,p->name,p->score);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值