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

这篇具有很好参考价值的文章主要介绍了#Day13 C基础(指针数组、函数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

指针数组

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:堆区空间的首地址
返回值:无文章来源地址https://www.toymoban.com/news/detail-797027.html

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

到了这里,关于#Day13 C基础(指针数组、函数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华清远见嵌入式学习——ARM——作业2

    目录 作业要求: 现象: 代码: 思维导图: 模拟面试题: GPIO实验——3颗LED灯的流水灯实现

    2024年02月03日
    浏览(42)
  • 华清远见作业第四十天——Qt(第二天)

    使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为\\\"admin\\\",密码是否为\\\"123456\\\",如果账号密码匹配成功,则输出“登录成

    2024年02月22日
    浏览(39)
  • C语言--指针详解(下)--字符指针、数组指针、指针数组、函数指针、函数指针数组(转移表)

    在C语言中有一种指针类型为字符指针 char*,常用其来表示字符,使用如下: 除了上述用法之外,还可以有以下的用法: 在上面的代码中,字符 \\\" hello word \\\"是常量字符串,将\\\"hello word\\\"放入 pstr 指针的实质是将第一个字符 “ h \\\" 的地址传递给了 pstr ,通过首字符 ” h \\\" 就可以访问

    2024年02月03日
    浏览(46)
  • C语言的函数指针、指针函数, 函数数组

    是指向函数的指针,它允许您在程序运行时动态选择要调用的函数。函数指针可以像普通变量一样传递、存储和使用,这使得它们在许多编程场景中非常有用,如回调函数、函数表、插件架构等。 以下是一个简单的例子来说明函数指针的概念: 函数数组是一个数组,其中的

    2024年02月09日
    浏览(42)
  • 【C语言】指针的基本知识详细讲解(指针数组、数组指针、函数指针....

    接着上次的函数的基本知识,今天我们来讲一讲🔍指针 目录 一、指针的概念 二、指针变量 三、野指针 四、字符指针 五、指针与数组 六、指针数组 七、数组指针  八、指针与函数 总结 一、指针的概念 1.1、变量和地址 所谓指针,也就是内存的地址;所谓指针变量,也就是

    2023年04月08日
    浏览(38)
  • 【C语言】指针进阶:字符指针&&数组指针&&函数指针

    ✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 🌹 感谢您的点赞与关注,同时欢迎各位有空来访我的 🍁平凡舍 回想之前,我们学了 指针 的一些基础👉 指针与结构体 我们知道了指针的概念: 指针就是

    2023年04月08日
    浏览(42)
  • 【go语言基础】指针数组和数组指针

    (1)指针数组: 存储指针的数组,也叫存储地址的数组,简单说就是存储地址的。 首先它是一个数组,数组中的元素都是指针(地址)。 (2)数组指针: 首先它是一个指针,存储的是指向数组的指针。 (1)指针数组 定义: 注意:首先是一个数组,将数组中的元素定义为

    2024年02月13日
    浏览(51)
  • 【C语言基础入门】二级指针、一维数组与指针、二维数组与指针

    在学习C语言的过程中,理解指针的概念是非常重要的。指针提供了一种直接访问内存地址的方式,使得我们可以更加灵活地管理数据和内存。在本文中,我们将介绍C语言中的二级指针、一维数组与指针,并通过通俗易懂的语言和示例代码来帮助读者理解这些概念。 二级指针

    2024年02月05日
    浏览(55)
  • (C语言)用函数指针数组实现计算器

    一、运算结果; 二、源代码;

    2024年01月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包