C语言----指针数组

目录

[1. 定义:](#1. 定义:)

[2. 格式:](#2. 格式:)

应用示例

1) 用于存放普通变量的地址 用于存放普通变量的地址)

2) 用于存放二维数组的每一行第一个元素的地址(列地址) 用于存放二维数组的每一行第一个元素的地址(列地址))

3) 用于存放字符串 用于存放字符串)

4) 命令行参数 命令行参数)

补充:开辟堆区空间(动态空间开辟)

[// 动态开辟](#// 动态开辟)


1. 定义:

本质是数组,里面存放的是指针

2. 格式:

存储类型 数据类型 *数组名元素个数

int* arr2;

应用示例

1) 用于 存放 普通变量的 地址

int a = 10, b = 20, c = 30;

int *p3 = {&a, &b,&c};

访问 b的地址

p1 *(p+1)

访问b 的值

*p1 *(*(p+1))

2) 用于存放二维数组的每一行第一个元素的地址(列地址)

int a23 = {1, 2, 3, 4 ,5 , 6};

int *p2= {a0, a1};

访问 a12的地址:

p1+2 *(p+1)+2

3) 用于存放字符串

char str32 = "hello";

char *str = "hello";

printf("%s\n", str);

printf("%p %p\n", str, &str0);

printf("%c %c\n", *(str+1), str1);

使用指针数组存放字符串的方式:

char *p3 = {"hello", "world", "ikun"};

打印 ikun字符串

printf("%s\n", p2); // ikun

printf("%s\n", *(p+2)); // ikun

printf("%s\n", *(p+2)+1); // kun

打印 'k'这个字符

printf("%c\n", *(p2+1)); // k

printf("%c\n", *(*(p+2)+1)); // k

复制代码
%s  只认地址,得到字符串的首地址
p[1]       得到字符串的首地址  (注意和数组元素进rmat '行区分)
4) 命令行 参数
复制代码
int main(int argc, char const *argv[])
{
    printf("%s\n",argv[0]);
     printf("%s\n",argv[1]);
}
// gcc 文件名.c 编译完成之后
// ./a/out 1234

argv:就是一个指针数组,里面存放的是命令行传递的字符串

argc:表示argv指针数组里面存储数据的个数,即命令行传递字符串的个数

补充:开辟堆区空间(动态空间开辟)

<补充>

为什么存在动态内存开辟

<1>在技术方面,普通的空间申请,都是在全局或者栈区,全局一般不太建议大量使用,而栈空间有限,那么如果一个应 用需要大量的内存空间的时候,需要通过申请堆空间来支持基本业务。

<2>在应用方面,程序员很难一次预估好自己总共需要花费多大的空间。想想之前我们定义的所有数组,因为其语法约束,我们必须得明确"指出"空间大小.但是如果用动态内存申请(malloc)因为malloc是函数,而函数就可以传参,也就意味着,我们可以通过具体的情况,对需要的内存大小进行动态计算,进而在传参申请,提供了很大的灵活性

// 动态开辟

#include <stdlib.h>

void *malloc(size_t size);

功能:在堆区开辟空间

参数:size:开辟空间的大小 (单位:字节)

返回值:

成功:返回开辟空间的首地址

失败:NULL;

#include <stdlib.h>

void free(void *ptr);

功能:释放堆区空间

参数:ptr:堆区空间的首地址

返回值:无

例子:

复制代码
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int *p = (int *)malloc(sizeof(int)*10);
   // 容错判断
    if(NULL == p)
    {
        printf("开辟失败,请注意内存的释放");
        return -1;
    }
    printf("开辟成功");
    // 写操作
    free(p);
    p = NULL;

    return 0;
}

注意:
1.手动开辟堆区空间,要注意内存泄漏
当指针指向开辟堆区空间后,又对指针重新赋值,则没有指针指向开辟带队去空间,就会造成内存泄漏
2.使用完堆区空间后及时释放空间
相关推荐
捷瑞电子工坊4 小时前
嵌入式秋招面经:5大核心模块高频考题与实战避坑总结
c语言·stm32·嵌入式工程师·rtos·通信协议·嵌入式面试
天空'之城5 小时前
C 语言工业级通用组件手写 30:安全内存拷贝组件
c语言·内存拷贝·工业级组件·安全内存操作
LuminousCPP7 小时前
数据结构-双向循环链表
c语言·数据结构·笔记·链表
小僧景贤9 小时前
嵌入式C语言 第二篇:基础语法|嵌入式C与标准C的核心差异
c语言·开发语言·嵌入式c语言
wuyk55511 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
LuminousCPP12 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
带鱼吃猫13 小时前
预处理器:宏、运算符与条件编译
c语言·开发语言
(Charon)13 小时前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++
SunnyByte14 小时前
排序进阶:快速排序与归并排序的迭代实现,并与递归版本对比
c语言·数据结构·算法·排序算法
wuminyu15 小时前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++