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

news2024/12/22 20:17:40

指针
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.coloradmin.cn/o/1050472.html

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

相关文章

2023下半年信息系统集成设计师

选择题 第一章 信息基础知识第二章 信息系统集成第三章 专业技能知识第四章 项目管理一般知识第五章 项目立项管理第六章 项目整体管理第七章 项目范围管理第八章 项目进度管理第九章 项目成本管理第十章 项目质量管理第十一章 项目管理干系人第十三章 合同管理第十五章 配置管…

秋招应届毕业生求职 如何通过在线测评?

对于应届毕业生来说&#xff0c;求职应聘必定会遇到在线测评的环节&#xff0c;很多同学都会疑惑&#xff0c;不知道怎么应对&#xff0c;也有些同学说我已经很认真了&#xff0c;为何我别刷了下来&#xff1f; 这里面到底有何玄机&#xff1f; 1、应聘前要多做性格测试 …

Django模板加载与响应

前言 Django 的模板系统将 Python 代码与 HTML 代码解耦&#xff0c;动态地生成 HTML 页面。Django 项目可以配置一个或多个模板引擎&#xff0c;但是通常使用 Django 的模板系统时&#xff0c;应该首先考虑其内置的后端 DTL&#xff08;Django Template Language&#xff0c;D…

【Java】复制数组的四种方式

1. System.arraycopy() 用来将一个数组的&#xff08;一部分&#xff09;内容复制到另一个数组里面去。 定义&#xff1a; void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);例&#xff1a; int[] arr1 { 1, 2, 3, 4, 5 }; int[] arr2 new…

青藏高原1-km分辨率生态环境质量变化数据集(2000-2020)

青藏高原平均海拔4000米以上&#xff0c;人口1300万&#xff0c;是亚洲九大河流的源头&#xff0c;为超过15亿人口提供淡水、食物和其他生态系统服务&#xff0c;被誉为地球第三极和亚洲水塔。然而&#xff0c;在该地区的人与自然的关系的研究是有限的&#xff0c;尤其是在精细…

1500*C. Kefa and Park(dfstree)

Kefa and Park - 洛谷 Problem - 580C - Codeforces Examples input 4 1 1 1 0 0 1 2 1 3 1 4 output 2 input 7 1 1 0 1 1 0 0 0 1 2 1 3 2 4 2 5 3 6 3 7 output 2 解析&#xff1a; dfs遍历&#xff0c;记录前一个结点权值是否为1&#xff0c;并且累计路径1的个数…

MySQL学习笔记23

逻辑备份&#xff1a; 1、回顾什么是逻辑备份&#xff1f; 逻辑备份就是把数据库、数据表或者数据进行导出&#xff0c;导出到一个文本文件中。 2、逻辑备份工具&#xff1a; mysqldump&#xff1a;提供全库级、数据库级别以及表级别的数据备份。 mysqldumpbinlog&#xff…

1200*A. Flipping Game(前缀和)

解析&#xff1a; 100数据量&#xff0c;两层遍历每个区间&#xff0c;然后前缀和计算1的个数&#xff0c;维护最大值即可。 #include<bits/stdc.h> using namespace std; #define int long long const int N110; int n,a[N],res,sum[N]; signed main(){scanf("%ll…

[Linux调查局] 编译过程

编译过程 引子编译阶段预处理汇编编译链接 链接详解release && debug 引子 一个程序的编译分为4个部分: 预处理 头文件的展开条件编译宏的展开去掉注释 编译 生成汇编汇编 生成计算机认识的机器指令, 即二进制文件链接 将程序和 库 链接 &#x1f5e8;️这里有一个疑…

《Reinforcement Learning: An Introduction》第8章笔记

文章目录 Chapter 8 Planning and Learning with Tabular Methods8.1 Models and Planning8.2 Dyna: Integrated Planning, Acting, and Learning8.3 When the Models Is Wrong8.4 Prioritized Sweeping8.5 Expected vs. Sample Updates8.6 Trajectory Sampling8.7 Real-time D…

南京大学【软件分析】13 Static Analysis for Security

文章目录 1. Information Flow Security2. Confidentiality and Integrity3. Explicit Flows and Covert/Hidden Channels4. Taint Analysis污点分析案例 1. Information Flow Security 引起安全问题最主要的两大原因是&#xff1a;injection errors&#xff08;2013-2019排名…

Disucz插件-免费最全Disucz插件大全

在网络世界里&#xff0c;拥有一个活跃并充满吸引力的社区论坛是许多网站管理员和品牌经营者的梦想。然而&#xff0c;要让一个论坛充满活力、吸引大量用户&#xff0c;需要大量的内容。这就是为什么许多人转向Disucz插件的原因。Disucz插件不仅可以帮助您创建一个互动性强大的…

数据响应式原理

面试题&#xff1a;请阐述vue2响应式原理 vue官方阐述&#xff1a;https://cn.vuejs.org/v2/guide/reactivity.html 响应式数据的最终目标&#xff0c;是当对象本身或对象属性发生变化时&#xff0c;将会运行一些函数&#xff0c;最常见的就是render函数。 在具体实现上&#x…

基于SpringBoot的飘香水果购物网站

目录 前言 一、技术栈 二、系统功能介绍 水果信息管理 减积分管理 会员购买订单管理 首页 水果 购买水果订单管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的电商平台以及购物…

crypto:大帝的密码武器

题目 下载zip之后可得到提示文本 结合题目名和文本提示可知&#xff0c;为凯撒密码 利用脚本&#xff0c;爆破位移的位数 str1 FRPHEVGL str2 str1.lower() num 1 for i in range(26):print("{:<2d}".format(num),end )for j in str2:if(ord(j)num > or…

【QT开发(6)】0926-QT 中加入 fastDDS 通信库的程序使用说明

在智能驾驶中&#xff0c;DDS有可能被广泛使用&#xff0c;因此推出这篇说明教程。 1、基于【QT开发&#xff08;5&#xff09;】教程的项目文档进行开发 2、安装DDS 查看《【eProsima Fast DDS&#xff08;1&#xff09;】安装eProsima Fast DDS》 至少安装: foonathan_m…

idea Springboot 高校科研资源共享系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 高校科研资源共享系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…

spring源码解析——IOC-开启 bean 的加载

概述 前面我们已经分析了spring对于xml配置文件的解析&#xff0c;将分析的信息组装成 BeanDefinition&#xff0c;并将其保存注册到相应的 BeanDefinitionRegistry 中。至此&#xff0c;Spring IOC 的初始化工作完成。接下来我们将对bean的加载进行探索。 BeanFactory 当我…

WinPcap4.1.3安装失败解决方法,A newer version of winpcap...

WinPcap4.1.3安装失败解决方法&#xff0c;A newer version of winpcap… 如图所示&#xff0c;提示本地安装有更高版本的WinPcap时&#xff0c;按如下操作即可解决。 找到相应文件&#xff0c;扩展名修改成如下&#xff1a; C:\Windows\SysWOW64 的wpcap.dll改成 wpcap.dll.…

微服务治理:构建强大、健壮的分布式系统

文章目录 什么是微服务治理&#xff1f;微服务治理的挑战1. 服务注册和发现2. 负载均衡3. 故障处理4. 安全性5. 监控和日志记录 构建强大的微服务治理1. 服务网格2. 服务注册和发现3. 负载均衡4. 故障处理5. 安全性6. 监控和日志记录 微服务治理的未来 &#x1f389;欢迎来到架…