栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言——指针(进阶版)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言——指针(进阶版)

                        目录

                指针的进阶

                1.字符指针

                 2.指针数组

                 3.数组指针

        3.1 数组指针的定义

         3.2数组指针的使用

4.动态内存分配与指向它的指针变量

4.1 什么是内存的动态分配

 4.2怎样建立内存的动态分配

1.用malloc函数开辟动态存储区

2.用calloc 函数开辟动态存储区

 3.用realloc函数重新分配动态存储区

 4.用free函数释放动态存储区


指针的进阶

本章重点

回顾上一篇博客 c语言——指针 我们已经先了解了指针的基本概念:

1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间;

2.指针的大小是固定的4/8字(32位平台/64的平台)。

3.指针是有类型丶指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限

4.指针的运算。

1.字符指针

在指针的类型中我们知道有一种指针类型为字符 char*;

一般使用:

int  main(){
    char ch = 'w';
    char *pc =&ch;
    *pc='w';
    return 0;

}

还有一种方法如下:

int main(){
const char *p = "hello bit."  //这里是把一个一个字符串放到p指针变量里面吗??
printf("%sn",p);
return 0;
}

代码 const char *p="hello bit."

特别让大家误认为是字符串 hello bit.放到字符指针p里了,但是本质是把字符串hello bit

首字符的地址放到了p中。

 2.指针数组

在《指针》章节我们也学了指针数组,指针数组是一个存放指针的数组

下面的指针数组是什么意思?

int *arr1[10];  //整型指针的数组
char *arr2[4];  //一级字符指针的数组
char **arr3[5]; //二级字符指针的数组

 3.数组指针

3.1 数组指针的定义

数组指针是指针? 还是数组?

答案 是 :指针

整型指针:int *pint 能够指向整型数据的指针。

浮点型指针:float *pf;能够指向浮点型数据的指针。

那数组指针应该是:能够指向数组的指针。

下面代码哪个是数组指针?

int *p1[10];
int (*p2)[10];
//p1,p2分别是什么?

解释

int (*p)[10];


//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。
所以p是一个指针,叫数组指针。

//这里要注意:[]的优先级要高于*号的,所以必须加上()来确保p先和*结合。


 3.2数组指针的使用

那数组指针是怎么使用的呢?

既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。

来看一段代码!

#include
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9,0};
int (*p)[10];=&arr;//把数组arr的地址赋给数组指针变量p
//但是我们基本上不用这种代码
return  0;

}

一个数组指针的使用↓

#include
void print_arr(int arr[3][5],int row,int col{
int i = 0;
for(i=0;i 
 

4.动态内存分配与指向它的指针变量

4.1 什么是内存的动态分配

全局变量是是分配在内存中的静态存储区的非静态的局部变量(包括形参)是分配在内存中的动态存储区,这个存储区是一个称为栈(stack)的区域。除此之外,C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要随时开辟,不需要随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆(heap)区。可以根据需要,向系统申请所需的大小的空间。由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数组,只能通过指针来引用。

 4.2怎样建立内存的动态分配

对内存的动态分配是通过系统提供的库函数来实现的。主要有malloc,calloc,free,realloc 这4个函数。

1.用malloc函数开辟动态存储区

void *malloc(unsigned int size);

某作用是在内存的动态存储区中分配 一个长度为size的连续空间。形参size的类型定位无符号整型(不允许为负数)。次函数的值(即“返回值”)是所分配区域的第一个字节的地址,

或者说,此函数是一个指针型函数,返回的指针指向该分配域的第一个字节 如:

malloc(100) :                    //开辟100字节的临时分配域,函数值为其第一个字节的地址

注意指针的基类型为void,即不指向任何类型的数据,只提供一个纯地址。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。

2.用calloc 函数开辟动态存储区

其函数原型为

void *calloc(unsigned n.unsigned size);

其作用是在内存的动态存储区分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。

用calloc函数可以为一维数组数组开辟动态存储空间,n为数组元素个数,每个元素长度为

size。这就是动态数组。函数返回指向所分配域的第一个字节的指针;如果分配不成功,返回NULL。如:

p=calloc(50,4) //开辟50×4个字节的临时分配域,把首地址赋给指针变量p

 3.用realloc函数重新分配动态存储区

其函数原型为
void *realloc(void *p,unsigned int size);
如果已经通过malloc函数或calloc函数获得了动态空间,想要改变其大小,可以用recalloc函数重新分配。
用realloc 函数将p所指向的动态空间的大小改变为size,p的值不变。如果重分配不成功,返回NULL,如
relloc(p,500);

 4.用free函数释放动态存储区

其函数原型为

void free(void *p);

其作用是释放指针变量p所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用calloc或malloc函数时得到的函数返回值,如:

free(p);       //释放指针变量p所指向的已分配的动态空间

free 函数无返回值。

以上4个函数的声明在stdlib.h头文件,在用到这些函数时应用“”#include  "

指令吧stdlib.h头文件包含到程序文件中

新年第一篇博客 希望友友们可以大力支持 

再次 小王同学祝大家虎年大吉 虎虎生威

祝大家新的一年 多拿offer ,开开心心进大厂!(doge) 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/722579.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号