云计算百科
云计算领域专业知识百科平台

c语言 第六章上:指针(持续更新中……)

 

内存:程序运行过程中,可以访问到的内存存储空间;计算机为了方便对内存的管理,以字节为单位,

 

对内存进行了编号。

 

地址:计算机管理内存时,给内存的编号。

 

指针:指针即为地址,地址即为指针,指针指向了一个具体的空间 。

 

指针变量:变量,保存地址的变量,需要占用内存空间。

 

 

1. 指针基础

 

指针变量的定义

 

基类型 *变量名;

 

基类型:该指针指向的空间存储的数据的数据类型

 

intchar floatdoublevoid、构造数据类型

 

* : 类型说明符,说明后面的变量是一个指针

 

变量名:遵循标识符的命名规则

 

p开头

pmaxptmp….

int *pint

char *pch

int *pi*pj

 

指针变量中保存的地址,是该指针指向的数据的首地址。

 

 

sizeof(指针);在64位计算机系统下,指针在内存中占用8字节。

 

32位计算机系统下,指针在内存中占用4字节。

 

 

指针变量的初始化和赋值

 

int *p = NULL;

int *p = &num

 

p = #

 

野指针:未初始化或赋值的一个指针,或者指向一个已经释放的内存空间的指针。

 

避免野指针:

 

1. 给指针初始化成空指针NULL0)。

 

1. 给指针变量初始化成已有的变量的地址。

 

指针运算符

 

* 指针运算符

用来访问指针变量指向的内存空间中的数据

 

*指针变量;—–》指针降级为变量类型》基类型的变量

 

int *p;

p; —->int *

*p; —->int

char *pch

*pch —->char

 

【注意】

1. * 指针运算符,只能放在指针变量的前边。

2. *指针变量, 访问指针变量指向的数据,该表达式降级为变量类型》基类型的变量

3. *指针变量,访问的字节数取决于定义该指针时的基类型,访问sizeof(基类型)字节。

 

char *p; *p—>char —>访问1字节

int *p*p—>int —->访问4字节

double *p*p–>double —->访问8字节

 

 

& 取地址运算符

 

获取某个变量的首地址。

 

&变量名;

1. &只能给一个变量取地址,不能给常量或者表达式取地址。

2. &给某个变量取地址时,获取的是这个变量首字节的地址。

 

 

指针的算数运算

 

+ – * / % ++ —

 

+ * / % 对于指针运算无意义。

 

:指针1-指针2:表示两个指针之间间隔的元素个数(地址值之间的字节差/sizeof(基类型)

 

++ :指针+1 :表示从当前地址向后偏移sizeof(基类型)字节

 

:指针-1:表示从当前地址向前偏移sizeof(基类型)字节

 

char *p; p+1; —-> 向后偏移1字节

int *p; p+1; —-> 向后偏移4字节

 

 

2. 指针作为函数参数

 

1. 被调函数中,想要修改主调函数中定义的变量,必须传递该变量的地址。

 

2. 被调函数中,想要使用主调函数中定义的变量,可以传递值,也可以传递地址。

 

3. 被调函数想要返回多个结果时,可以传递主调函数定义的变量的地址,地址指向的空间可以保存被调函数得到的结果。

 

 

 

 

3. 指针和一维整形数组

 

数组的数组名为数组的首元素地址,且是一个地址常量。

 

【注意】数组名为地址常量(右值),不能为其赋值

 

a ===>&a[0]

a[0] —->*a

a[1] —->*(a+1)

a[2] —->*(a+2)

a[n] —->*(a+n)

 

 

 

一维整形数组作为函数参数传递:

 

void print_array(int a[  ], int len)

{

 

}

 

 

void print_array(int *pa, int len)

{

 

}

 

 

 

4. 指针和一维字符型数组的关系

 

数组的数组名为数组的首元素地址,且是一个地址常量。

 

 

 

char str[32] = {"hello"};

 

str ===> &str[0] ====> char * ——–> *str ====> str[0]

str+1 ==>&str[1] ====> char * ——–> *(str+1) ==>str[1]

str+n ==>&str[n] ====> char * ——–> *(str+n) ==>str[n]

 

str+1; 指针向内存高地址偏移sizeofchar)字节数

str-1; 指针向内存低地址偏移sizeofchar)字节数

 

int mystrlen(char str[ ])

{

}

 

int mystrlen(char *str)

{

}

 

 

 

5. 数组指针

 

数组指针:本质是指针, 指向数组整体的指针。

 

语法:

 

int (*变量名)[5]; —-》数组指针

 

定义一个指针变量,指针变量自己占8字节空间,可以指向一个具有5个元素的整形数组。

 

int a[5] = {1,2,3,4,5};

 

数据类型

 

a : 首元素地址==&a[0] ===>int *

 

&a: 数组的指针=============>int (*)[5];

 

&a+1 :数组指针+1 ====》代表偏移整个数组(sizeofa)字节)

 

 

 

 

【注意】

int a[5] = {1,2,3,4,5};

 

a :首元素地址int *

 

除了2种场景:

1. sizeof(a/数组名); a不能当作int *类型,当作数组整体,代表整个数组。

2. &a;数组指针,该指针类型为:int *[5]; 指向一个数组整体。

 

 

 

6.指针和二维数组

 

二维数组的数组名是首元素地址,首元素是一维数组,所以二维数组数组名本质是一个一维数组指针。

 

int a[5] = {1,2,3,4,5};

 

a 首元素地址 &a[0] int *

 

a[n] —>*(a+n)

 

int a[2][3] = {1,2,3,4,5,6};

 

a 首元素地址 &a[0] int (*)[3];–>数组指针

 

a[m][n] ===> *(a[m]+n) ===> *(*(a+m)+n)

 

 

 

二维数组的数组名作为函数参数传递:

 

int a[2][3] = {1,2,3,4,5,6};

 

void print_2D_array(int a[   ][列数]int hang)

{

}

void print_2D_array(int (*pa)[列数]int hang)

{

}

print_2D_array(a, 2);

 

 

char str[3][100] = {"hello", "world", "thanks"};

 

void print_str_array(char str[][100], int hang)

{

}

void print_str_array(char (*pstr)[100], int hang)

{

}

print_str_array(str, 3);

 

 

 

【练习】用指针传参,输出最大值

 

 

 

 

 

 

 

【练习】从终端输入两个数,封装一个函数,通过传地址的方式,求这两个数的最大公约数和最小公倍数。

 

 

 

 

 

 

 

【练习】封装函数,使用指针的方式,实现冒泡排序和选择排序。

 

 

 

 

 

【练习】封装函数,使用指针的方式将整型数组逆序。

 

 

 

赞(0)
未经允许不得转载:网硕互联帮助中心 » c语言 第六章上:指针(持续更新中……)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!