您的位置:首页 > 编程语言 > C语言/C++

(十四)C语言高级编程

2016-12-21 15:35 190 查看
一、指针

1、地址:内存的基本单元是字节,每个字节都有一个编号,这个编号就称为地址

指针:地址就是指针

指针变量:专门用来存放地址的变量

2、定义:存储类型 数据类型 *指针变量名

存储类型:指针变量的存储类型

数据类型:指针所指向的变量的数据类型

指针的类型:数据类型*

int *p = NULL; //定义指针时一定要对指针进行初始化

int a = 10;

int *p = &a;

指针就是操作内存的工具

指针的四要素:1、指针的类型 2、指针所指向的类型 3、指针所指向的内存 4、指针所占内存的大小

3、指针的算术运算:p+n:向地址增大的方向移动了n个数据

注:指针的算术运算必须在一块连续且有效的内存上操作,指针类型必须一致,指针的数据类型明确了指针所能操作的内存范围,在使用指针时,一定注意不要越界

可以通过强制类型转换改变指针操作内存范围的大小

4、指针与数组

-->数组名的含义:1、代表一个数组 2、代表数组首元素的地址

-->指针与二维数组

通过一级指针操作二维数组,必须要将二维数组强制转换为(int *)类型,然后用一维数组的方式去操作,因为二维数组在内存中的存储方式实质上也是一维的

-->指针数组与数组指针:

指针数组:本质上是个数组,这个数组的元素是指针 int *p[ 3 ]

数组指针:本质上是个指针,指针是指向一个数组的指针 int (*p)[ 3 ]

-->多级指针:指针的指针

-->const修饰的指针:(左数右指)

防止指针所指向的内容被修改,或者指针的指向发生改变

const int *p; *p不能被修改,p可以被修改

int *const p; *p可以被修改,p不可以被修改

const int *const p; *p和p都不能被修改

-->void修饰的指针:不知道操作的内存范围有多大,只是指向对象的首地址,用之前必须进行强制类型转换

当void* 类型的指针作为函数的形参时,可以接受任何类型的指针

void不能修饰普通变量,因为系统不知道分配多大的内存空间给该变量

注:在使用指针时,程序员心里必须非常清楚,指针究竟指向了哪里

二、函数

1、函数的定义

存储类型 数据类型 函数名(数据类型 形参1,数据类型 形参2,……)

{

函数体;

返回值;

}

2、函数的声明:存储类型 数据类型 函数名(数据类型 形参1,数据类型 形参2,……);

存储类型 数据类型 函数名(数据类型 ,数据类型 ,……);

3、函数的调用:函数名(实参1,实参2,……);

4、函数的传参:

1、值传递:将实参值复制一份给形参,实参和形参有独立的内存空间

2、地址传递:实质是将实参的地址复制了一份给形参,实参与形参的内存空间也不同

//防止头文件重复包含

#ifndef _FUN_H_

#define _FUN_H_

int Swap ( int *iTemp1 , int *iTemp2 )

#endif

< >:预处理时,到系统指定的路径下查找头文件

" ":到我们自己指定的路径下查找头文件,如果查找不到,就去系统指定的路径下查找

3、数组的传参:一维数组:首地址与元素个数

二维数组:行号、列号、首地址

5、指针函数与函数指针

指针函数:本质上是一个返回值为只指针的函数,但是要注意返回的指针指向一个有效的内存

保证有效的方式:1、static

2、malloc 成功后要memset,初始化内存,用完free,free后指针置为NULL

3、char *p = “hello”

函数指针:本质是一个指针,函数名本质是一个地址,,是函数的入口地址,所以可以通过指针调用函数

二、结构体

字节对齐的规则:(注意用在对齐参数为默认值的情况下)(从大往小,节省时间)

1、结构体的每一个成员的起始地址必须是自设类型的整数倍,且每个成员分别按照自己的对齐参数对齐

说明:每个成员按其类型的对齐参数(通常是类型的大小)和指定的对齐参数中较小的一个对齐

2、结构体的整体大小必须可被对齐参数整除(默认是4)

如果改变了对齐参数:(#pragma pack(),注意括号内的值只能取1,2,4)

注:字节对齐时,如果结构体成员类型小于对齐参数时,按照指定的对齐参数对齐,如果结构体自身类型大于对齐参数,按照自身类型对齐

三、共用体

多个数据类型共用一块存储空间,以成员中占用内存最大的成员作为共用体的大小,在同一时刻以最后一次赋值为准

四、枚举

通常用作错误码的定义,防止在程序中出现数值,同时起到助记
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息