博客
关于我
C语言指针的那些子事儿
阅读量:390 次
发布时间:2019-03-05

本文共 1916 字,大约阅读时间需要 6 分钟。

目录

1、概念理解

在这里插入图片描述

指针是一个地址,一个变量的地址就是该变量的指针
指针变量的值是地址,即指针变量是存放指针地址的东东
以上
int * pointer 就是一个 int 型的指针,pointer 是指向 int 型变量的指针变量-----类型说明符 * 变量名;
& i 就是取 i 的地址,pointer = & i 就是取 i 的地址将其值赋给pointer
在这里插入图片描述

2、指针与scanf

C语言其实没有字符串概念,只有字符数组,不能自动分配空间,要存放数据,必须预先定义存储空间的大小

scanf能赋值字符数组,但不能赋值给指针,

(1)接收char型数组

在这里插入图片描述

此处scanf接收数组是可行的,并且没有用&

(2)接收char型指针变量

在这里插入图片描述

char *name;语句会定义一个指针,该指针未被初始化,是个无效的地址,会引起非法访问
指针只是个地址,要往指针所在的地址里存放内容,就必须给指针分配空间。
如果事先分配好了空间,scanf才可以给字符串指针赋值。

(3)给指针分配空间

在这里插入图片描述

像这样事先分配好了空间,scanf才可以给字符串指针赋值。

(4)综合练习

在这里插入图片描述

3、小知识点

1、指针变量就是内存地址(错)

指针变量指向的是内存地址,这两个概念并不等价
2、指针变量内的地址不可以改变(错)
指针变量存储的地址可以改变
3、函数的形式参数可以是指针变量 (对)
如果传入函数的是内存地址,对应的形式参数就是指针变量了
4、字符串字面量是一个指针变量。(错)
字面量并不是变量
5、* 加上指针变量名表示取指针地址所储存的值(对)
这种方式下, * 是取值符,加上变量名会取出指向的地址所储存的值。
6、指针变量被用于存储的是某一内存内的地址。(对)
指针变量都是用于保存某一内存的地址的变量
7、int类型的指针会从指定地址向后寻找4个字节作为变量的储存单元,char类型的指针会从指定地址向后寻找1个字节作为变量的储存单元。(对)
在这里插入图片描述

4、练习题

(1)输入a、b两个整数,按先大后小的顺序输出

在这里插入图片描述

(2)用函数实现交换功能

在这里插入图片描述

(3)输入三个整数呢?

在这里插入图片描述

5、内存中数据存放

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6、char型数组

在这里插入图片描述

这里讲了为什么scanf接收char型数据不用&
相似的原因,数组与指向数组的指针在输出时(第五行和第九行)是一样的,所以其实数组名就是一个指针
对比9和12行,输出要求的格式%d%s不同,值也不同。

7、malloc.h

1、malloc.h,动态存储分配函数头文件,当对内存区进行操作时,调用相关函数。ANSI标准建议使用stdlib.h头文件,但许多C编译要求用malloc.h,使用时应查阅有关手册。

2、其实在标准库中还有一个类似的calloc函数,与malloc函数不同,它接受两个参数,分别是申请的空间单位的总数 n 和每一个空间单位要占堆区上空间的大小。

在这里插入图片描述
calloc与malloc主要有两点不同:
calloc函数申请的内存空间是经过初始化的,全部被被设成了0,而不是像malloc所申请的空间那样都是未经初始化的。 calloc函数适合为数组申请空间,可以将第二个参数设置为数组元素的空间大小,将第一个参数设置为数组的元素数量。
在这里插入图片描述

使用free(arr);释放arr数组指向的被分配的堆区上的空间。

为了避免错误地使用arr指针,再次触碰到那个已经不应该再被访问的地址对应的内存。将这个叫arr的指针数组指向一个叫NULL的位置,使之成为一个空指针。
在这里插入图片描述

3、malloc.h,动态存储分配函数头文件,当对bai内存区进行操作时,调用相关函数.。

4、malloc函数是一种分配长度为num_bytes字节的内存块的函数,可以向系统申请分配指定size个字节的内存空间。说通俗点就是动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。

5、malloc 函数返回的是 void * 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。

6、void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型)。

8、指向指针的指针

在这里插入图片描述

在这里插入图片描述
int * q;声明了一个指向int*类型变量的指针。而&p取出了指针变量p在内存中的地址,q=&p把指针变量p所在内存地址存到了指针变量q中,让指针q指向了指针p。这时候,如果输出q应该得到的是指针变量p的地址,如果输出 * q 应该得到的是指针变量p存储的值,也应该就是变量a的地址

转载地址:http://bewzz.baihongyu.com/

你可能感兴趣的文章
Mysql 表分区
查看>>
mysql 表的操作
查看>>
mysql 视图,视图更新删除
查看>>
MySQL 触发器
查看>>
mysql 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
查看>>
MySQL 错误
查看>>
mysql 随机数 rand使用
查看>>