C理解(二):指针,数组,字符串,函数

本文主要探讨指针,数组,字符串,函数

指针
        int *p;    
        未绑定:*表示p为指针变量,占4字节
        int a = 1;p = &a;
        绑定:p与a地址绑定即p中存放a的地址
        *p = *p +1;
        解引用:p间接访问a的存储空间

左值与右值
        int a = 1;
        左值:变量对应的内存空间
        右值:内存空间存储的数

野指针
        野指针:指针变量定义时未初始化去解引用导致
        避免野指针:
                    定义指针,初始化为NULL
                    指针解引用前,判断NULL
                    指针使用完,赋值为NULL
                    指针使用前,赋值绑定给可用地址空间

const与指针
            const int *p; = int const *p;(*p为常量)
            int * const p; (p为常量)
            const int * const p;(p和*p为常量)
            注意:const近谁修饰谁
            注意:参数输入前加const,未加const参数是输出参数(默认)

数组
        int a[5];
        数组一次分配多个变量,变量在内存中存储依次相连(内存地址连续)
        a是数组名,a不能做左值,a做右值表示数组首元素的首地址(&a[0])
        a[0]表示数组首元素,做左值表示数组首元素的内存空间,做右值表示首元素的值
        &a表示整个数组首地址,做右值表示数组首地址,不能为左值
        &a是整个数组首地址,a是数组首元素地址,形式相同,意义不同
        a和&a[0]做右值意义和数值相同

指针与数组
        int *p; 
        int a[5];  
        p = a;
        int (*q)[];
        q = &a;
        p+1; 
        p是 int *类型,&a是整个数组的指针,类型是int (*)[]
        p+1表示p偏移1*sizeof(int)字节

指针与类型解析
        所有类型数据都是以二进制的方式存储在内存中,int、char、short为整形,存储方式是相同,所占内存空间大小不同,float和double存储方式不同,与整形不同
        int a = 5;a分配4字节,将5按int类型存储方式转成二进制存到对应内存空间中,printf打印a,printf内部的vsprintf按格式化字符串(%d)代表的类型解析a所对应的内存空间中的01序列

指针数据类型
        int *p;p是变量本身,是int *类型,解析方式是地址解析。*p是指针指向的变量,是int类型。
        char占1字节,int占4字节,int范围比char大,char的范围之内int和char可以相互解析,超过char范围后int解析char就会出错

sizeof和strlen
        sizeof是计算变量或数据类型占用内存的字节数
        strlen是计算字符串长度(不计入'\0','\0'为结束符
 
define和typedef定义指针类型
        #define dpChar char *
        typedef char *tpChar;
        dpChar p1,p2; <==> char *p1,p2; <==> char *p1;char p2;      
        tpChar p3,p4; <==> char *p3;char *p4;    


指针数组与数组指针
        指针数组是数组,数组中存储指针变量
        数组指针是指针,指针指向数组
        int *p[5]; 指针数组
        int (*p)[5]; 数组指针  
        int *(p[5]); 指针数组

函数指针与typedef
        函数指针:void (*p)(); 类型是void (*)()
        typedef定义数据类型,类型是数据模板,类型不占内存
        注意:
            typedef int* PINT;  
            const PINT p; <==> int *const p;
            typedef int* PINT;  
            PINT const p; <==> int *const p;
            typedef const int* CPINT; 
            CPINT p; <==> const int *p;

字符串与字符数组
        字符串是指针指向头、固定尾部('\0')的地址的一段连续内存
        char *p = "linux";p是字符指针,指向字符串起始地址
        p是字符指针,占4字节,"linux"在代码段,5字节存储"linux",'\0'占1字节,共10个字节
        字符数组char a[] = "linux";<==> char a[] = {'l', 'i', 'n', 'u', 'x', '\0'};占6字节

递归函数
        内存:栈内存中执行递归,每次递归都需要消耗栈内存
        收敛性:递归函数必须终止递归条件,栈内存耗尽之前递归收敛,否则栈溢出

main函数
        main函数是整个程序的入口,返回值给父进程(0执行成功,负数执行失败),shell用$?打印执行结果
        父进程给main函数传参,int main(int argc,char *argv[]);argc是参数个数,argv是字符串数组(实际参数)

demo1:

        修改gcc编译器定义的const类型数据(部分编译器如此)

#include <stdio.h>int main()
{const int a = 10;int *p;p = &a;printf("before modify : a = %d\n",a);printf("before modify : *p = %d\n",*p);(*p)++;printf("after modify : a = %d\n",a);printf("after modify : *p = %d\n",*p);return 0;
}

demo2:

        sizeof和strlen练习

#include <stdio.h>int main()
{char str[] = "hello";  printf("sizeof(str) = %d\n",sizeof(str));     printf("sizeof(str[0]) = %d\n",sizeof(str[0]));  printf("strlen(str) = %d\n",strlen(str));char *p=str; printf("sizeof(p) = %d\n",sizeof(p));  printf("sizeof(*p)  = %d\n",sizeof(*p));  printf("strlen(p)  = %d\n",strlen(p));     int n=10; printf("sizeof(n)  = %d\n",sizeof(n));              int b[100];printf("sizeof(b)  = %d\n",sizeof(b));return 0;
}

结果示例:

demo3:

       5的 阶乘

        

#include <stdio.h>int factorial(int num)
{if(num == 1){return 1;}else{return num * factorial(num-1);}
}int main()
{int result;result = factorial(5);printf("the factorial of 5 is %d\n",result);return 0;
}

结果示例:

         递归内部剖析

#include <stdio.h>void factorial(int num)
{printf("before factorial :num = %d\n", num);if (num > 1){factorial(num-1);}else{printf("factorial end : num = %d\n", num);}printf("after factorial : num = %d\n", num);
}int main()
{factorial(3);return 0;
}

结果示例:

         斐波那契数列

        F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3)

#include <stdio.h>int func(int num)
{if(num == 1){return 1;}else if(num == 2){return 2;}else{return func(num-1)+func(num-2);}
}int main()
{int result;result = func(5);printf("the func of 5 is %d\n",result);return 0;
}

结果示例:

 demo3:

        main函数的返回值

#include <stdio.h>int main()
{return 27;
}

结果示例:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九、Delay函数

1、两个延时函数 vTaskDelay&#xff1a;至少等待指定个数的Tick Interrupt才能变为就绪态。vTaskDelayUntil&#xff1a;等待到指定的绝对时刻&#xff0c;才能变为就绪态。 2、函数原型 /* xTicksToDelay: 等待多少个Tick */ void vTaskDelay( const TickType_t xTicksToD…

Android Studio 的android.jar文件在哪儿

一般在&#xff1a;C:\Users\admin\AppData\Local\Android\Sdk\platforms\android-33下&#xff08;不一定是33&#xff0c;这个得看你Android Studio->app->builde.gradle的targetSdk是多少&#xff09; 怎么找&#xff1a; 1.打开Android Studio 粘贴地址后&#xff0…

13.(开发工具篇github)如何在GitHub上上传本地项目

一:创建GitHub账户并安装Git 二:创建一个新的仓库(repository) 三、拉取代码 git clone https://github.com/ainier-max/myboot.git git clone git@github.com:ainier-max/myboot.git四、拷贝代码到拉取后的工程 五、上传代码 (1)添加所有文件到暂存

Ci2451-2.4g无线MCU收发芯片

Ci2451 是一款集成无线收发器和8位RISC(精简指令集)MCU的SOC芯片。 无线MCU解决方案,集成丰富的MCU资源、更小尺寸,来满足设计中的各种内存、功率、尺寸要求,充分缩短2.4GHz无线产品设计周期并优化产品成本。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff…

通讯网关软件016——利用CommGate X2Access实现OPC数据转储Access

本文介绍利用CommGate X2ACCESS实现从OPC Server读取数据并转储至ACCESS数据库。CommGate X2ACCESS是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从OPC Server读取数据并转储至ACCESS…

2023年【起重信号司索工(建筑特殊工种)】考试总结及起重信号司索工(建筑特殊工种)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重信号司索工(建筑特殊工种)考试总结是安全生产模拟考试一点通生成的&#xff0c;起重信号司索工(建筑特殊工种)证模拟考试题库是根据起重信号司索工(建筑特殊工种)最新版教材汇编出起重信号司索工(建筑特殊工种)仿…

5、Docker安装mysql主从复制与redis集群

安装mysql主从复制 主从搭建步骤 1.1 新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master #3307映射到3306&#xff0c;容器名为mysql-master -v /app/mysql/mydata/mysql-master/log:/var/log/mysql #容器数据卷 -v /app/mysql/mydata/mysql-master/dat…

[Linux]Git

文章摘于GitHub博主geeeeeeeeek 文章目录 1.1 Git 简易指南创建新仓库工作流添加与提交推送改动 1.2 创建代码仓库git init用法讨论裸仓库 例子 git clone用法讨论仓库间协作 例子用法讨论栗子 1.3 保存你的更改git add用法讨论缓存区 栗子 git commit用法讨论记录快照&#xf…

巧用@Conditional注解根据配置文件注入不同的bean对象

项目中使用了mq&#xff0c;kafka两种消息队列进行发送数据&#xff0c;为了避免硬编码&#xff0c;在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案&#xff0c;仅供参考&#xff01; 方案一&#xff1a;创建一个工具类&#xff0c;然后根据配置文…

JMM与JUC

1.JMM 问题1&#xff1a;请你谈谈你对Volatile的理解 Volatile 是java虚拟机提供轻量级的同步机制 1. 保证可见性 2. 不保证原子性 3. 禁止指令重排 1.1、什么是JMM JMM Java内存模型 不存在的东西&#xff0c;概念&#xff01;约定 &#xff01; 1.2、关于JMM的一些同…

ICMP差错包

ICMP报文分类 Type Code 描述 查询/差错 0-Echo响应 0 Echo响应报文 查询 3-目的不可达 0 目标网络不可达报文 差错 1 目标主机不可达报文 差错 2 目标协议不可达报文 差错 3 目标端口不可达报文 差错 4 要求分段并设置DF flag标志报文 差错 5 源路由…

Spring学习笔记10 JdbcTemplate

Spring学习笔记9 SpringIOC注解式开发_biubiubiu0706的博客-CSDN博客 JdbcTemplate是Spring提供的一个JDBC模板类,是对JDBC的封装,简化JDBC代码. 新建模块spring-jdbctemplate 引入依赖 <dependencies><!--Spring Context依赖--><dependency><groupId>…

Socket网络编程练习题三:客户端上传文件到服务器

题目 客户端&#xff1a;将本地文件上传到服务器&#xff0c;接收服务器的反馈服务端&#xff1a;接收客户端上传的文件&#xff0c;上传完毕之后给出反馈 代码实战 1、客户端代码 package com.heima;import java.io.*; import java.net.Socket;public class Client {publi…

基于Java+SpringBoot+Vue火车订票管理系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

C++ -- 特殊类设计

目录 设计一个类&#xff0c;不能被拷贝 C98的做法 C11的做法 设计一个类&#xff0c;只能在堆上创建对象 实现方式1 实现方式2 设计一个类&#xff0c;只能在栈上创建对象 实现方式1 方式1的优化 实现方式2 设计一个类&#xff0c;不能被继承 设计模式 什么是设计…

Event Loop——事件循环

JS 是单线程的&#xff0c;也就是同一个时刻只能做一件事情。 那么思考&#xff1a;为什么浏览器可以同时执行异步任务呢&#xff1f;因为浏览器是多线程的。 当 JS 需要执行异步任务时&#xff0c;浏览器会另外启动一个线程去执行该任务。 也就是说&#xff0c;“JS 是单线程…

WordPress主题网站首页添加好看的四格小工具教程

直接到网站根目录创建一个css文件(文件名:sige.css),文件名可自定义(注意文件名一致) <link rel"stylesheet" href"你的网站/sige.css" type"text/css" > 然后在header.php模板最上方添加引入代码 也可自定义HTML里添加css代码最上方写…

百度交易中台之内容分润结算系统架构浅析

作者 | 交易中台团队 导读 随着公司内容生态的蓬勃发展&#xff0c;内容产出方和流量提供方最关注的“收益结算”的工作&#xff0c;也就成为重中之重。本文基于内容分润结算业务为入口&#xff0c;介绍了实现过程中的重难点&#xff0c;比如千万级和百万级数据量下的技术选型和…

[H5动画制作系列 ]变量,帧频,监听器等的生命周期基础测试

模式:按照上述抓图,actions层&#xff0c;1帧,写初始化代码,10帧写返回代码到2帧代码,2-10帧之间一直循环。1帧及10帧代码如下&#xff1a; 如果程序在1-10之间循环,会反复创建变量i,多个监听器等。所以,第一帧最好执行一次即可&#xff0c;程序在2-10帧之间一直循环。

OpenAI 更新 ChatGPT:支持图片和语音输入【附点评】

一、消息正文 9月25日消息,近日OpenAI宣布其对话AI系统ChatGPT进行升级,添加了语音输入和图像处理两个新功能。据OpenAI透露,这些新功能将在未来两周内面向ChatGPT Plus付费用户推出,免费用户也将很快可以使用这些新功能。这标志着ChatGPT继续朝着多模态交互的方向发展,为用户提…