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.mzph.cn/news/90709.shtml

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

相关文章

【接口测试】HTTP协议

一、HTTP 协议基础 HTTP 简介 HTTP 是一个客户端终端&#xff08;用户&#xff09;和服务器端&#xff08;网站&#xff09;请求和应答的标准&#xff08;TCP&#xff09;。通常是由客户端发起一个请求&#xff0c;创建一个到服务器的 TCP 连接&#xff0c;当服务器监听到客户…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 C: 班级活动

[蓝桥杯 2023 国 B] 班级活动 【问题描述】 小明的老师准备组织一次班级活动。班上一共有 n n n 名&#xff08; n n n 为偶数&#xff09;同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 n n …

以太坊智能合约的历史里程碑: 从DAO到数据隐私的技术演进

文章目录 系列文章目录前言一、时间线 项目介绍总结 前言 在短短的几年内&#xff0c;以太坊不仅成为了去中心化应用和智能合约的主导平台&#xff0c;而且也见证了区块链技术和应用的多次重大革命。本文详细回顾了自2016年至今&#xff0c;以太坊生态所经历的几个关键时刻与技…

leetcodetop100(29) K 个一组翻转链表

K 个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…

React Native搭建Android开发环境

React Native搭建Android开发环境 搭建Android开发环境一、下载JDK二、安装Android Studio2.1 配置 ANDROID_HOME 环境变量 三、初始化项目 搭建Android开发环境 我的电脑是windows系统&#xff0c;所以只能搭建Android&#xff0c;如果电脑是mac&#xff0c;既可以搭建Androi…

修改sqlmap-Tamper脚本

修改sqlmap-Tamper脚本 文章目录 修改sqlmap-Tamper脚本1 sqlmap官网2 sql注入漏洞注入尝试3 环境&#xff1a;sqli-labs/Less-26a/3.1 尝试宽字节注入: 3.2 sqlmap使用3.3准备修改sqlmap使用 4 sqlmap中-tamper工厂&#xff08;输入输出&#xff09;4.1 [参考文章&#xff1a;…

蓝桥杯 题库 简单 每日十题 day11

01 质数 质数 题目描述 给定一个正整数N&#xff0c;请你输出N以内&#xff08;不包含N&#xff09;的质数以及质数的个数。 输入描述 输入一行&#xff0c;包含一个正整数N。1≤N≤10^3 输出描述 共两行。 第1行包含若干个素数&#xff0c;每两个素数之间用一个空格隔开&…

rust生命期

一、生命期是什么 生命期&#xff0c;又叫生存期&#xff0c;就是变量的有效期。 实例1 {let r;{let x 5;r &x;}println!("r: {}", r); }编译错误&#xff0c;原因是r所引用的值已经被释放。 上图中的绿色范围’a表示r的生命期&#xff0c;蓝色范围’b表示…

pygame实现跳跃发射子弹打怪效果

import pygame import sys,time,random from pygame.locals import * pygame.init() # 设置按下鼠标的时候一直触发 pygame.key.set_repeat(10, 10) # 加载背景图片 bg pygame.image.load(./img/bg.png) # 加载左方向行走和站立图片 heroLStand pygame.image.load(img/heroLs…

传统遗产与技术相遇,古彝文的数字化与保护

古彝文是中国彝族的传统文字&#xff0c;具有悠久的历史和文化价值。然而&#xff0c;由于古彝文的形状复杂且没有标准化的字符集&#xff0c;对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术&#xff0c;旨在提高古彝文的自动识别准确性…

十七,IBL-打印各个Mipmap级别的hdr环境贴图

预滤波环境贴图类似于辐照度图&#xff0c;是预先计算的环境卷积贴图&#xff0c;但这次考虑了粗糙度。因为随着粗糙度的增加&#xff0c;参与环境贴图卷积的采样向量会更分散&#xff0c;导致反射更模糊&#xff0c;所以对于卷积的每个粗糙度级别&#xff0c;我们将按顺序把模…

【单片机】11-步进电机和直流电机

1.直流电机 1.什么是电机 电能转换为动能 2.常见电机 &#xff08;1&#xff09;交流电机【大功率】&#xff1a;两相【200W左右】&#xff0c;三相【1000W左右】 &#xff08;2&#xff09;直流电机【小功率】&#xff1a;永磁【真正的磁铁】&#xff0c;励磁【电磁铁】 &…

3种Renko图表形态FPmarkets3秒轻松判断价格走势

Renko图表形态在交易中的应用并不逊色于其他技术分析方法。相较于普通的烛台图表&#xff0c;使用Renko图表时&#xff0c;有些经典模式更容易被发现和识别&#xff0c;FPmarkets总结这些模式包括&#xff1a; 首先是头和肩膀形态。这是一种价格反转形态&#xff0c;由两个较小…

华为智能企业远程办公安全解决方案(1)

华为智能企业远程办公安全解决方案&#xff08;1&#xff09; 课程地址方案背景需求分析企业远程办公业务概述企业远程办公安全风险分析企业远程办公环境搭建需求分析 方案设计组网架构设备选型方案亮点 课程地址 本方案相关课程资源已在华为O3社区发布&#xff0c;可按照以下…

Java编码技巧:验证码

目录 1.1、EasyCaptcha&#xff08;优选&#xff0c;支持种类多&#xff0c;样式多&#xff0c;使用简单&#xff09;1.1.1、作用1.1.2、官方信息1.1.3、使用案例1.1.4、依赖1.1.5、代码1.1.6、效果1.1.7、拓展 1.2、kaptcha1.2.1、作用1.2.2、官方信息1.2.3、使用案例1.2.4、依…

SLAM从入门到精通(amcl定位使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 学习slam&#xff0c;一般就是所谓的边定位、边制图的知识。然而在实际生产过程中&#xff0c;比如扫地机器人、agv、巡检机器人、农业机器人&…

聊一聊JDK21-虚拟线程

目录 前言 Virtual Threads的开始 为什么需要Virtual Threads JDK19 预览版初次出现 JDK21 Virtual Threads的正式发布 Virtual Threads 该怎么使用 简单聊聊Virtual Threads的实现 使用时候的注意事项 本地尝鲜一下JDK21及Virtual Threads 结语 前言 2023年9月19日…

字符串改错题(找出代码中所有错误,将一个字符串倒序)

#include "string.h" main() {char *pSrc "hello,world";char *pDest NULL; int iLen strlen(pSrc);pDest (char*)malloc(iLen);char *pD pDest;char* pS pSrc[iLen]; while(iLen--!0){pD pS--;}printf("%s", pDest);return 0; }在使用 m…

C理解(五):编译,链接库,宏,关键字,变量

编译 编译过程 文件.c->(预处理)->文件.i->(编译)->文件.S->(汇编)->文件.o->(链接)->elf程序 预处理 内容:加载头文件(#include),清除注释(//,./*),替换条件编译(#if #elif #endif #ifdef),替换宏定义(#define) …

探索社会工程的深度:从定义到高级攻击策略

在广阔的网络安全领域&#xff0c;社会工程作为一种微妙的威胁而出现&#xff0c;它利用人类的漏洞来访问敏感信息或实施欺诈。网络安全背景下的社会工程的定义很明确&#xff1a;它包括使用欺骗手段操纵个人泄露机密或个人信息&#xff0c;然后将这些信息用于欺诈目的。 此类…