美文网首页C语言C++编程学习C语言
C语言编程中数组和指针没有那么难,只要你掌握这几点

C语言编程中数组和指针没有那么难,只要你掌握这几点

作者: C语言学习 | 来源:发表于2018-04-30 00:02 被阅读3次

我们在之前讲到过指针的本质是变量,当然指针也就会占用一定的内存空间。我们便可以定义指针的指针来保存指针变量的地址值啦,这便是我们所说的二维指针啦。

那么为什么需要指向指针的指针呢?指针的本质便是变量,对于指针也同样存在传值调用和传址调用。我们来看看一个示例代码,代码如下

#include

#include

int reset(char**p, int size, int new_size)

{

int ret = 1;

int i = 0;

int len = 0;

char* pt = NULL;

char* tmp = NULL;

char* pp = *p;

if( (p != NULL) && (new_size > 0) )

{

pt = malloc(sizeof(int) * new_size);

tmp = pt;

len = (size

for(i=0; i

{

*tmp++ = *pp++;

}

free(*p);

*p = pt;

}

else

{

ret = 0;

}

return ret;

}

int main()

{

char* p = (char*)malloc(5);

printf("%p\n", p);

if( reset(&p, 5, 3) )

{

printf("%p\n", p);

}

free(p);

return 0;

}

我们看到这个函数的功能是重置申请内存空间的大小,在最后打印的是重置前后的指针的地址。如果重置成功,地址便会改变,结果如下

小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

那么二维数组究竟是怎样的呢?二维数组在内存中是以一维数组的方式排布的,它的第一维是一维数组。第二维才是具体的值,二维数组的数组名也可看做常量指针。下图更形象的说明了

那么我们接下来以代码为例进行分析

#include

void PrintArray(int a[], int size)

{

int i = 0;

printf("PrintArray : %d\n", sizeof(a));

for(i=0; i

{

printf("%d\n", a[i]);

}

}

int main()

{

int a[3][3] = {, , };

int* p = &a[0][0];

int i = 0;

int j = 0;

for(i=0; i

{

for(j=0; j

{

printf("%d ", *(*(a + i) + j)); // *(a + i) ==> a[i]; *(a[i] + j) ==> a[i][j]

}

printf("\n");

}

printf("\n");

PrintArray(p, 9);

return 0;

}

我们看到在程序的第17行定义了二维数组 a,在第18行则定义了指针 p ,指向二维数组的首元素的地址。接下来我们便打印了这个数组,在第35行我们调用 PrintArray 函数打印数组。结果如下

我们看到二维数组在内存中也是呈一维分布的。那么一维数组名代表数组首元素的地址,二维数组名同样也代表数组首元素的地址。如:int a[5] a的类型为 int*; int m[2][5] m的类型为 int(*)[5];

二维数组名可看做是指向数组的常量指针,它也可以看做是一维数组,只不过数组中的每个元素同样也是同类型的一个数组。我们下来看看如何申请二维数组,代码如下

#include

#include

int** malloc2d(int row, int col)

{

int** ret = NULL;

if( (row > 0) && (col > 0) )

{

int* p = NULL;

ret = (int**)malloc(row * sizeof(int*));

p = (int*)malloc(row * col * sizeof(int));

if( (ret != NULL) && (p != NULL) )

{

int i = 0;

for(i=0; i

{

ret[i] = p + i * col;

}

}

else

{

free(ret);

free(p);

ret = NULL;

}

}

return ret;

}

void free2d(int** p)

{

if( *p != NULL )

{

free(*p);

}

free(p);

}

int main()

{

int** a = malloc2d(3, 3);

int i = 0;

int j = 0;

for(i=0; i

{

for(j=0; j

{

printf("%d, ", a[i][j]);

}

printf("\n");

}

free2d(a);

return 0;

}

我们在主函数里申请了二维数组 a,打印并释放它。我们来看看结果

如我们所愿,二维数组已经申请好了。通过对多维数组和多维指针的学习,总结如下:1、C 与应用中只支持一维数组,并且它的大小必须在编译期就作为常数确定;2、数组里的元素可以是任何类型的数据,甚至可以是另一个数组,这也就是多维数组的本质了。

相关文章

  • C语言编程中数组和指针没有那么难,只要你掌握这几点

    我们在之前讲到过指针的本质是变量,当然指针也就会占用一定的内存空间。我们便可以定义指针的指针来保存指针变量的地址值...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • Go语言 指针

    指针 概念 Go语言的指针和C语言一样也是用来保存地址的变量 格式 普通指针 指向数组的指针 注意点 GO语言中只...

  • Go语言指针

    只讲述和C语言地址的不同 格式:var 指针名称 *数据类型var 指针名称 *数据类型 = 地址 指向数组的指针...

  • 数据结构之静态链表

    前人没有C语言,或者说他们使用的语言没有类似C语言的指针功能.那他们是如何实现和描述链表的呢? 通过数组代替指针来...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • C语言 - 中

    总目录 前言 本文介绍C语言的指针:一、指针介绍二、指针使用三、数组指针和指针数组 函数指针和指针函数 环境 1...

  • 再学C语言之指针要点

    C之字符数组 C之指针引用字符串 C语言之数组指针 数组指针:首先它是一个指针,它指向数组指针数组:首先它是一个数...

  • C语言中指针和结构体和向该文件操作

    学习目的: 在C语言中熟练掌握指针的定义、用法和与数组的区别,以及结构体的定义和使用 相关技术,及其使用 指针:为...

网友评论

    本文标题:C语言编程中数组和指针没有那么难,只要你掌握这几点

    本文链接:https://www.haomeiwen.com/subject/baoalftx.html