#Day13 C基础(指针数组、函数)

news2024/11/14 20:22:25

文章目录

  • 指针数组
    • 1.定义:
    • 2.格式:
    • 3.应用示例:
      • 1)用于存放普通变量的地址
      • 2)用于存放二维数组的每一行第一个元素的地址(列地址)
      • 3)用于存放字符串
      • 4)命令行参数
  • 函数
    • 1.定义:
    • 2.三要素:
    • 3.格式:
    • 4.函数声明
    • 4.函数声明
    • 5.函数调用
    • 6.函数传参
      • 6.1.值传递
      • 6.2.地址传递
      • 6.3.数组传递
  • 开辟堆区空间(动态内容开辟)

指针数组

1.定义:

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

2.格式:

存储类型	数据类型	*数组名[元素个数]
int* arr[2];

3.应用示例:

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

int a = 10, b = 20, c = 30;
int *p[3] = {&a, &b, &c};

访问 b 的地址
p[1]		*(p+1)

访问 b 的值
*p[1]	*(*(p+1))

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

int a[2][3] = {1, 2, 3, 4 ,5 , 6};
int *p[2] = {a[0], a[1]};

访问 a[1][2] 的地址:
p[1]+2		*(p+1)+2

3)用于存放字符串

char str[32] = “hello”;
char *str = “hello”;
printf(“%s\n”, str);
printf(“%p %p\n”, str, &str[0]);
printf(“%c %c\n”, *(str+1), str[1]);

使用指针数组存放字符串的方式:
char *p[3] = {“hello”, “world”, “ikun”};
打印 “ikun” 字符串
printf(“%s\n”, p[2]); // ikun
printf(“%s\n”, *(p+2)); // ikun
printf(“%s\n”, *(p+2)+1); // kun

打印 ‘k’ 这个字符
printf(“%c\n”, *(p[2]+1)); // k
printf(“%c\n”, ((p+2)+1)); // k

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.三要素:

功能、参数、返回值

3.格式:

存储类型 数据类型 函数名(参数列表)
{
函数体;
return 函数返回值;
}
1)没有参数:参数列表可以省略,也可以使用 void
2)没有返回值:数据类型为void,函数内部没有return
3)有返回值:要根据返回值的数据类型定义函数的数据类型
4)定义子函数时可以直接定义在主函数上面,如果定义在主函数下面需要提前声明函数

4.函数声明

数据类型 函数名(参数列表); // 形参

4.函数声明

数据类型 函数名(参数列表); // 形参

5.函数调用

1)没有返回值:直接调用:函数名(参数列表); // 实参
2)有返回值:如果需要接收返回值,就要定义一个与返回值数据类型相同的变量接收
如果不需要接收返回值,就直接调用函数

6.函数传参

6.1.值传递

单向传递,将实参传递给形参使用,改变形参实参不会受到影响

#include <stdio.h>
int fun(int a, int b)
{
    a++;
    b++;
    return a + b;
}

int main(int argc, char const *argv[])
{

    int a = 3, b = 4;
    int num = fun(a, b);
    printf("%d %d %d\n", a, b, num);
    
    return 0;
}


6.2.地址传递

双向传递,在函数中修改形参,实参随之变化

#include <stdio.h>


int fun(int *a, int *b)
{
    *a = *a + *b;
    *b = *b + 2;
    return *a + *b;
}

int main(int argc, char const *argv[])
{
    int a = 3, b = 4;
    // 因为你是拿到了地址,对地址进行赋值,并不是拿到值
    int num = fun(&a, &b);
    printf("%d %d %d\n", a, b, num);
    return 0;
}

6.3.数组传递

和地址传递一样,参数中存在数组的定义,它也会认为是指针

#include <stdio.h>

char *fun(char str[32])
{
    str = "hello";
    printf("%d\n", sizeof(str)); // 4
    return str;
}

int main(int argc, char const *argv[])
{
    char *ch = fun("abc");
    printf("%s\n", ch);    
    return 0;
}
补充:
// s 在栈区空间开辟4字节空间存放字符串常量 "hello" 的首地址
char *s = "hello";

// 在栈区开辟 32 个字节的空间,存放 "hello" 字符串
char str[32] = "hello";

开辟堆区空间(动态内容开辟)

为什么存在动态内存开辟

<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.使用完堆区空间后及时释放空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pgBackRest备份工具使用】

一、工具介绍 pgBackRest是PostgreSQL数据库的一个开源备份工具&#xff0c;支持全量、增量和差异备份。这一点优于PG原生的备份工具pg_basebackup&#xff0c;因为pg_basebackup不支持增量备份&#xff0c;并且支持备份完整性检查等等。pgBackRest v2.49是当前的稳定版本。 项…

新手怎么投稿各大网络媒体网站

在当今信息爆炸的时代&#xff0c;网络媒体已成为人们获取新闻信息的主要渠道之一。无论是企业宣传、个人推广&#xff0c;还是新闻报道&#xff0c;都离不开网络媒体的力量。而要将自己的信息传达到更广大的受众群体&#xff0c;投稿各大网络媒体网站就成为了一个重要的环节。…

ARM day2、day3 汇编

一、汇编学习&#xff1a;可以向上理解软件、向下感知硬件 二、符号&#xff08;注释&#xff09; 注释#注释&#xff08;放在行首表示注释一行&#xff09;/* */注释#数字立即数&#xff1a;一种标号&#xff08;比如main: loop:&#xff09;.text .end换行…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-9 可观测性与分离原理

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-9 可观测性与分离原理

【Java JVM】栈帧

执行引擎是 Java 虚拟机核心的组成部分之一。 在《Java虚拟机规范》中制定了 Java 虚拟机字节码执行引擎的概念模型, 这个概念模型成为各大发行商的 Java 虚拟机执行引擎的统一外观 (Facade)。 不同的虚拟机的实现中, 通常会有 解释执行 (通过解释器执行)编译执行 (通过即时编…

Servlet项目教学(附实例代码)

【员工信息管理】 1.员工信息管理 1.1 介绍 用户进行登录后,可以对员工信息进行管理(增删查改),等操作.如果用户没有登录,不能访问员工操作页面.并且员工操作页面显示当前登录用户信息. 1.2 技术点 使用VueElementUI充当前端界面,使用ServletJDBCMysql提供数据管理控制.后端统…

嵌入式学习-网络编程-Day3

思维导图 多进程并发服务器通信模型如下 void handler(int signo) {while(waitpid()>0); //以非阻塞配合信号完成僵尸进程的回收 } int main() {//将信号与信号处理函数绑定signal(SIGCHLD, handler);socket(); //创建用于连接的套接字bind(); //绑定IP…

Python和Java代码实现:切线法求解一维最优化问题

Python和Java代码实现&#xff1a;切线法求解一维最优化问题 代码实现Python代码Java代码 求解实例 根据概念查询&#xff0c;切线法定义如下&#xff1a; 切线法&#xff08;Tangent Method&#xff09;是一种用于求解非线性方程的数值方法。它也被称为牛顿法&#xff08;Newt…

C++ 程序文档生成器(doxygen)使用说明

程序文档&#xff0c;是每个程序员必看文档&#xff0c;在日常业务开发中&#xff0c;难免会封装一些组件。没有很好的组件文档&#xff0c;再好的组件都是废物&#xff0c;。因此大型业务中&#xff0c;文档和思维导图&#xff0c;两个都是必备&#xff01; 一、注释风格 …

IPv6隧道--GRE隧道

GRE隧道 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一…

各种设备上恢复已删除的文件和文件夹的数据恢复软件清单

最好的数据恢复软件可以简单轻松地恢复计算机、移动设备或存储介质上已删除的文件和文件夹。 询问任何经历过数据丢失的人这是否是一种有趣的经历&#xff0c;他们会告诉您数据丢失&#xff0c;无论是由于硬件或软件故障、意外删除还是网络犯罪&#xff0c;都会带来极大的压力…

美国 SEC 批准比特币现货 ETF 上市,SEC 告诉我们的风险包含哪些?

撰文&#xff1a;Will 阿望 查看原文&#xff1a;美国 SEC 批准比特币现货 ETF 上市&#xff0c;SEC 告诉我们的风险包含哪些&#xff1f; 历经十年的 BTC ETF 艰辛审批之路终于迎来了胜利的曙光&#xff0c;2024 年 1 月 11 日凌晨 4 时&#xff0c;美国证监会&#xff08;S…

AIGC实战——像素卷积神经网络(PixelCNN)

AIGC实战——像素卷积神经网络 0. 前言1. PixelCNN 工作原理1.1 掩码卷积层 1.2 残差块2. 训练 PixelCNN3. PixelCNN 分析4. 使用混合分布改进 PixelCNN小结系列链接 0. 前言 像素卷积神经网络 (Pixel Convolutional Neural Network, PixelCNN) 是于 2016 年提出的一种图像生成…

礼贺新春,徐坊大曲新品【中国红】

梁山徐坊大曲新推出中国风礼盒&#xff0c;以中国红为主题&#xff0c;为即将到来的新春佳节增添了浓厚的节日气氛。为您呈现一场视觉与味觉的盛宴。从礼盒的颜色到图案设计&#xff0c;无不体现出中国红的热情与活力&#xff0c;象征着吉祥、喜庆与团圆。梁山徐坊大曲&#xf…

ubuntu qt 运行命令行

文章目录 1.C实现2.python实现 1.C实现 下面是封装好的C头文件&#xff0c;直接调用run_cmd_fun()即可。 #ifndef GET_CMD_H #define GET_CMD_H#endif // GET_CMD_H #include <iostream> #include<QString> using namespace std;//system("gnome-terminal -…

USB8814动态信号采集卡——声音振动类信号处理的理想之选!

背景介绍&#xff1a; 科技的发展在一定程度上依赖于对信号的处理&#xff0c;信号处理技术的先进性在很大程度上决定了科技发展的速度和方向。数字信号处理技术的崛起&#xff0c;彻底改变了传统的信息与信号处理方式&#xff0c;使得数据采集这一前期工作在数字系统中发挥着…

FTP文件传输协议 、多种方式安装yum仓库

一、网络文件共享服务 1.存储类型分三种&#xff1a; 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储…

ImageNet Classification with Deep Convolutional 论文笔记

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Leetcode23-数组能形成多少数对(2341)

1、题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数 从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长…

SpringMVC参数接收见解4

# 4.参数接收Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换…