当前位置:网站首页>第二部分—C语言提高篇_4. 二级指针
第二部分—C语言提高篇_4. 二级指针
2022-07-24 06:13:00 【qq_43205256】
4.1 二级指针基本概念
这里让我们花点时间来看一个例子,揭开这个即将开始的序幕。考虑下面这些声明:
int a = 12;
int *b = &a;它们如下图进行内存分配:

假定我们又有了第3个变量,名叫c,并用下面这条语句对它进行初始化:
c = &b;它在内存中的大概模样大致如下:

问题是:c的类型是什么?显然它是一个指针,但它所指向的是什么?变量b是一个“指向整型的指针”,所以任何指向b的类型必须是指向“指向整型的指针”的指针,更通俗地说,是一个指针的指针。
它合法吗?是的!指针变量和其他变量一样,占据内存中某个特定的位置,所以用&操作符取得它的地址是合法的。
那么这个变量的声明是怎样的声明的呢?
int **c = &b;那么这个**c如何理解呢?*操作符具有从右想做的结合性,所以这个表达式相当于*(*c),我们从里向外逐层求职。*c访问c所指向的位置,我们知道这是变量b.第二个间接访问操作符访问这个位置所指向的地址,也就是变量a.指针的指针并不难懂,只需要留心所有的箭头,如果表达式中出现了间接访问操作符,你就要随箭头访问它所指向的位置。
4.2 二级指针做形参输出特性
二级指针做参数的输出特性是指由被调函数分配内存。
//1.被调函数,由参数n确定分配多少个元素内存
void allocate_space(int **arr,int n)
{
//堆上分配n个int类型元素内存
int *temp = (int *)malloc(sizeof(int)* n);
if (NULL == temp)
{
return;
}
//给内存初始化值
int *pTemp = temp;
for (int i = 0; i < n;i ++)
{
*pTemp = i;
pTemp++;
}
//指针间接赋值
*arr = temp;
}
//2.打印数组
void print_array(int *arr,int n)
{
for (int i = 0; i < n;i ++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//3.二级指针输出特性(由被调函数分配内存)
void test()
{
int *arr = NULL;
int n = 10;
//给arr指针间接赋值
allocate_space(&arr,n);
//输出arr指向数组的内存
print_array(arr, n);
//释放arr所指向内存空间的值
if (arr != NULL)
{
free(arr);
arr = NULL;
}
}输出结果
0 1 2 3 4 5 6 7 8 94.3 二级指针做形参输入特性
二级指针做形参输入特性是指由主调函数分配内存。
//打印数组
void print_array(int **arr,int n)
{
for (int i = 0; i < n;i ++)
{
printf("%d ",*(arr[i]));
}
printf("\n");
}
//二级指针输入特性(由主调函数分配内存)
void test()
{
int a1 = 10;
int a2 = 20;
int a3 = 30;
int a4 = 40;
int a5 = 50;
int n = 5;
int** arr = (int **)malloc(sizeof(int *) * n);
arr[0] = &a1;
arr[1] = &a2;
arr[2] = &a3;
arr[3] = &a4;
arr[4] = &a5;
print_array(arr,n);
free(arr);
arr = NULL;
}输出结果
10 20 30 40 50边栏推荐
猜你喜欢

一日一书:机器学习及实践——从零开始通往kaggle竞赛之路
![[lvgl (6)] display Chinese settings and make Chinese font](/img/a4/1b0d0b7a5789ecc8f9a2a8cd93d92e.png)
[lvgl (6)] display Chinese settings and make Chinese font

Prediction of advertising investment and sales based on regression analysis -- K neighborhood, decision tree, random forest, linear regression, ridge regression

数据分析思维之从整体出发分析零售行业——全方位多方面细节分析
![[lvgl] [stage summary 1]](/img/39/c6e96ae7971a2350769ef5b5950f8f.png)
[lvgl] [stage summary 1]

渗透学习-SQL注入篇-靶场篇-安全狗的安装与绕过实验(后续还会更新)

Sealos 打包部署 KubeSphere 容器平台

Tensorflow Einstein function

Penetration learning - SQL injection - shooting range - installation and bypass experiment of safety dog (it will be updated later)

华为专家自述:如何成为优秀的工程师
随机推荐
Redis data type -string (string type)
/etc/rc. Local setting UI program startup and self startup
Geek planet ByteDance one stop data governance solution and platform architecture
[lvgl (6)] display Chinese settings and make Chinese font
You can't satisfy everyone!
极客星球丨 字节跳动一站式数据治理解决方案及平台架构
OSS authorizes a single bucket permission
STM32外部中断(寄存器版本)
一首伟大的赞歌
Redis 分片集群
济南人社已签1W+电子劳动合同,法大大助力HR数字化
Redis special data type bitmap
tensorflow boolean_ Mask function
2022-07-22 mysql/stonedb parallel hashjoin memory usage analysis
[USB voltmeter and ammeter] Based on stm32f103c8t6 for Arduino
GE口:SGMII模式和serdes模式
Libc.so.6/glibc cross compilation
Never lose yourself!
MySQL gets the self incrementing line mark (different from MySQL version)
Penetration learning - SQL injection - shooting range - installation and bypass experiment of safety dog (it will be updated later)