IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 关于C语言的学习小结(8)———指针 -> 正文阅读

[C++知识库]关于C语言的学习小结(8)———指针

导读

指针是什么?指针有什么用?为什么要学习指针???

指针

地址

运算符—&

作用为获得变量的地址(因此只能用于变量)
&不能对没有地址的量取地址
例如

scanf("%d",&(i++))//错误的
scanf("%d",&(i+b))//错误的

常用于是scanf运算符内

scanf("%d",&i)

在三十二位的架构下为4个字节
在六十四位的架构下为8个字节
注%p可以输出地址,并且以十六进制的形式输出(0x)

printf("%p\n",&i)

变量在堆栈(stuck)中储存,储存方式为自上而下,先储存的在上面,后储存的下面。

指针

作用:
保存地址的变量(其值为变量的地址)
形式:

int* p
int *p//与上式相同
int* p,q//p为指针,q不是
int *p,q//p为指针,q不是

普通变量的值为实际的值
指针变量的值为有实际值的普通变量的地址的值

运算符——*

*是一个单目运算符,用来访问指针的值所表示的地址上的变量。(与&相反)其既可以作左值,也可以作右值

指针的作用

可在函数中用指针变量改变函数外变量的值。
例如交换两个变量的值

void swap(int *a,int *b)
int t=*a
*b=*a
*b=t

函数返回多个值(因为函数最多只能返回一个值,所以需要返回多个值时,需要使用指针)
让函数返回特殊的不属于有效范围内的值来表示出错(0和-1)

不能定义指针变量后,没有指向任何变量就开始使用指针。

数组

参数表中的数组实际上是指针
数组变量本身表示地址,所以不需要使用&
数组的单元是变量,需要使用&
[]既可以对数组用,也可以对指针用
*既可以对指针用,也可以对数组用
数组变量是const的指针,不能被赋值

常量

const

const是一个修饰符,加在变量前,意味着变量不能被修改

指针是const

表示其一旦得到了某个变量的地址,就不能再指向其他变量。
表示方法

int *const q=&i//q是const,q的值不能被改变

指针所指的数是const

表示不能通过这个指针去修改那个变量(但是不能使那个变量变成const)
表示方法

const int *p=&i
i=26//可以
p=&j//可以
*p=26//不可以,*p是const,不能改变

const在*前为指针所指的数

const在*后为指针

转换

一个非const的值可以转换成const(常用于结构中,以防止函数对外面的变量进行修改。如果传递的参数类型比地址大时,可以用较少的字节传递值给参数)

const数组

在数组前加const,意味数组中的每一个元素都是const,因此在定义const数组时就应该全部进行初始化来进行赋值
作用:
可以用来保护数组
因为将数组传入函数时,传入的是地址,所以函数可以修改数组的值,如果设置参数const,可以保护数组的值。

int sum(const int a[]int

运算

指针计算

指针是可以进行+,-,++,–的运算的。+1意味着下一个数据(而不是地址上加一,例如int型的地址为+4。因为int的字符大小为4),同理-1意味着下一个数据。
两个地址可以进行相减。相减以后为之间的数据个数多少(不是地址的)
*p++
取出p所指的数据,并将将p移动到下一个位置
常用于数组

if(P=~;*P~~;*P++)
{
……
}

注:*p++的运行可以更快

指针比较

指针可以进行<,>,<=,>=,!=,==
地址是线性递增排列的

0地址

内存中有0地址,但0地址不能随意的触碰,因此指针不能指向0
但是0地址有一些特殊的事情,如让返回的指针无效化,让指针没有被真正初始化
有的编译器中不能用0来代表0地址,要用NULL

类型

指针有不同的类型,但不同类型的字节数相同,指的都是地址。同时不同类型的指针不能互相赋值
void表示不知道指向什么东西的指针
计算时与char
相同,但两者并不相同
指针也可以进行转换类型,转换后指针所指的变量的类型并未改变

内存

内存分配函数

malloc
可以向系统申请空间
参数类型

malloc(size-t size)

返回形式

void*//输出时需要转换类型

头文件

#include<stdlib.h>

使用

a=(int*)malloc(number*sizeof(int))//a既可以是指针,也可以是数组。int*是进行类型转换,number是数量,sizeof(int)是int的字节数,number*sizeof(int)是内存的大小

在使用完后要进行free(a)将空间还回去
如果没有空间将会申请失败,此时会返回一个NULL

内存释放函数

free
将申请的空间还给系统
注:申请过的空间都需要还,还时应还申请空间的首地址
常见问题
申请了没有free——长时间运行会使内存逐渐下降
free两次
地址发生改变后直接进行free

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 01:47:57  更:2022-09-15 01:49:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:02:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码