C语言基础入门详解二

news2024/9/24 5:26:21

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。
👉点击跳转到教程

一、C语言多级指针入门

#include<stdio.h>
#include<stdlib.h>

/**
	多级指针 
	指针指向的就是内存地址
	地址就是指针 
*/ 
main(){
	//定义一个int类型的变量i,并且赋值为100; 
	int i = 100;
	//定义一个int类型的一级指针变量address1,并且把i的地址赋值给它 
	int* address1 = &i;
	//定义一个int类型的二级指针变量address2,并且把address1对应的地址赋值给它 
	int** address2 = &address1;
	//定义三级指针 
	int*** address3 = &address2;
	//定义四级指针
	int**** address4 = &address3;
	
	//多级指针取值 ****address4得到的值是100
	printf("****address4==%d\n",****address4); 
	****address4 = 2000;
	printf("****address4==%d\n",****address4); 
	
	printf("***address3==%d\n",***address3); 
	****address4 = 2000;
	printf("***address3==%d\n",***address3); 
	printf("i==%d\n",i); 
	system("pause");
}

输出到控制台内容如下:
在这里插入图片描述
对应的内存分析图如下:
在这里插入图片描述
二、C语言中数组的简介

#include<stdio.h>
#include<stdlib.h>

/**
	数组的介绍
	1.数组的取值
	2.数组的取地址
	3.数组是一块连续的内存空间
	4.数组的首地址和数组的地址相同 
	5.数组的设计 
*/ 
main(){
	char cArray[] = {'H','E','L','L','O'}; 
	int iArray[] = {1,2,3,4,5};
	//取数组的值
	printf("cArray[0]==%c\n",cArray[0]); 
	printf("iArray[0]==%d\n",iArray[0]); 
	
	//取内存地址
	printf("cArray地址==%#x\n",&cArray); 
	printf("cArray[0]地址==%#x\n",&cArray[0]); 
	printf("cArray[1]地址==%#x\n",&cArray[1]); 
	printf("cArray[2]地址==%#x\n",&cArray[2]); 
	printf("cArray[3]地址==%#x\n",&cArray[3]); 
	
	//内存是一块连续的内存空间 
	printf("iArray地址==%#x\n",&iArray); 
	printf("iArray[0]地址==%#x\n",&iArray[0]); 
	printf("iArray[1]地址==%#x\n",&iArray[1]); 
	printf("iArray[2]地址==%#x\n",&iArray[2]); 
	printf("iArray[3]地址==%#x\n",&iArray[3]);
	
	//用指针去取值
	printf("iArray==%d\n",*iArray); 
	printf("iArray[0]==%d\n",*iArray+0); 
	printf("iArray[1]==%d\n",*iArray+1); 
	printf("iArray[2]==%d\n",*iArray+2); 
	printf("iArray[3]==%d\n",*iArray+3); 

	printf("iArray[0]==%d\n",*(iArray+0)); 
	printf("iArray[1]==%d\n",*(iArray+1)); 
	printf("iArray[2]==%d\n",*(iArray+2)); 
	printf("iArray[3]==%d\n",*(iArray+3)); 
	
	
	printf("cArray[0]==%c\n",*(cArray+0)); 
	printf("cArray[1]==%c\n",*(cArray+1)); 
	printf("cArray[2]==%c\n",*(cArray+2)); 
	printf("cArray[3]==%c\n",*(cArray+3)); 
	system("pause");
}

输出到控制台内容如下:

在这里插入图片描述
三、C语言中让用户输入数组

#include<stdio.h>
#include<stdlib.h>

/**
	用户输入一个数组 
*/ 
main(){
	printf("请输入数组的长度:\n");
	//1.用户输入数组的长度
	int length;
	scanf("%d",&length);
	printf("您输入的数组长度为:%d\n",length);
	//2.用户根据用户输入的长度创建数组 
	int iArray[length];
	//3.让用户输入数组的值
	int i;
	for(i=0;i<length;i++){
		printf("请输入iArray[%d]的值:\n",i);
		scanf("%d",&iArray[i]);
	}
	//4.把数组内容打印出来
	for(i=0;i<length;i++){
		printf("iArray[%d]的值=%d\n",i,iArray[i]);
	}
	 
	system("pause");
}

输出到控制台内容如下:

在这里插入图片描述
四、C语言中数组的取值运算

#include<stdio.h>
#include<stdlib.h>

/**
	数组的介绍
	1.数组的取值
	2.数组的取地址
	3.数组是一块连续的内存空间
	4.数组的首地址和数组的地址相同 
	5.数组的设计 
*/ 
main(){
	char cArray[] = {'H','E','L','L','O'}; 
	int iArray[] = {1,2,3,4,5};
	//取数组的值
	printf("cArray[0]==%c\n",cArray[0]); 
	printf("iArray[0]==%d\n",iArray[0]); 
	
	//取内存地址
	printf("cArray地址==%#x\n",&cArray); 
	printf("cArray[0]地址==%#x\n",&cArray[0]); 
	printf("cArray[1]地址==%#x\n",&cArray[1]); 
	printf("cArray[2]地址==%#x\n",&cArray[2]); 
	printf("cArray[3]地址==%#x\n",&cArray[3]); 

    printf("cArray地址==%#x\n",cArray); 
	printf("cArray+0地址==%#x\n",cArray+0); 
	printf("cArray+1地址==%#x\n",cArray+1); 
	printf("cArray+2地址==%#x\n",cArray+2); 
	
	//内存是一块连续的内存空间 
	printf("iArray地址==%#x\n",&iArray); 
	printf("iArray[0]地址==%#x\n",&iArray[0]); 
	printf("iArray[1]地址==%#x\n",&iArray[1]); 
	printf("iArray[2]地址==%#x\n",&iArray[2]); 
	printf("iArray[3]地址==%#x\n",&iArray[3]);
	
	printf("iArray地址==%#x\n",iArray); 
	printf("iArray+0地址==%#x\n",iArray+0); 
	printf("iArray+1地址==%#x\n",iArray+1); 
	printf("iArray+2地址==%#x\n",iArray+2); 
	printf("iArray+3地址==%#x\n",iArray+3);
	
	//用指针去取值
	printf("iArray==%d\n",*iArray); 
	printf("iArray[0]==%d\n",*iArray+0); 
	printf("iArray[1]==%d\n",*iArray+1); 
	printf("iArray[2]==%d\n",*iArray+2); 
	printf("iArray[3]==%d\n",*iArray+3); 

	printf("iArray[0]==%d\n",*(iArray+0)); 
	printf("iArray[1]==%d\n",*(iArray+1)); 
	printf("iArray[2]==%d\n",*(iArray+2)); 
	printf("iArray[3]==%d\n",*(iArray+3)); 
	
	
	printf("cArray[0]==%c\n",*(cArray+0)); 
	printf("cArray[1]==%c\n",*(cArray+1)); 
	printf("cArray[2]==%c\n",*(cArray+2)); 
	printf("cArray[3]==%c\n",*(cArray+3)); 
	system("pause");
}

输出到控制台内容如下:

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>

/**
	用户输入一个数组 
*/ 
main(){
	printf("请输入数组的长度:\n");
	//1.用户输入数组的长度
	int length;
	scanf("%d",&length);
	printf("您输入的数组长度为:%d\n",length);
	//2.用户根据用户输入的长度创建数组 
	int iArray[length];
	//3.让用户输入数组的值
	int i;
	for(i=0;i<length;i++){
		printf("请输入iArray[%d]的值:\n",i);
//		scanf("%d",&iArray[i]);
		scanf("%d",iArray+i);
	}
	//4.把数组内容打印出来
	for(i=0;i<length;i++){
//		printf("iArray[%d]的值=%d\n",i,iArray[i]);
		printf("iArray[%d]的值=%d\n",i,*(iArray+i));
	}
	 
	system("pause");
}

输出到控制台内容如下:

在这里插入图片描述

五、C语言中的指针长度

#include<stdio.h>
#include<stdlib.h>

/**
	指针的长度 是八个字节 
	在C语言中,指针的长度是由平台的架构和操作系统的位数决定的。
	在大多数32位操作系统中,指针的长度为4字节(32位),而在64位操作系统中,指针的长度为8字节(64位)
*/ 
main(){
	int* iPoint;
	char* cPoint;
	printf("iPoint的长度==%d\n",sizeof(iPoint));
	printf("cPoint的长度==%d\n",sizeof(cPoint)); 
	system("pause");
}

输出到控制台内容如下:

在这里插入图片描述
六、C语言中静态内存分配

#include<stdio.h>
#include<stdlib.h>
/**
	静态内存分配地址 
*/ 
void func(int** address){
	//定义int类型的i变量,并且赋值100 
	int i = 100;
	//把i对应的地址赋值给 iPoint 
	*address= &i;
}
main(){
	//定义int类型的一级指针变量iPoint 
	int* iPoint;
	func(&iPoint);
	printf("*iPoint===%d\n",*iPoint);//*iPoint===100  
	printf("*iPoint===%d\n",*iPoint);//*iPoint===0 出现这个的原因是静态内存分配,执行完func()函数后,会被系统回收 
	printf("*iPoint===%d\n",*iPoint);//*iPoint===0
	system("pause");
} 

静态内存是程序编译执行后系统自动分配,由系统自动释放,静态内存是栈分配的。

七、C语言中动态内存分配

#include<stdio.h>
#include<stdlib.h>
/**
	动态内存分配 
*/ 
void func(int** address){
	int i = 100;
	int* temp; 
	//malloc(int)-返回内存地址 
	temp=malloc(sizeof(int));
	//把i对应的值,赋值给temp地址对应的值 
	*temp = i;
	//把address对应的地址,对应的值改为temp 
	*address = temp;
	
//	free(temp); //回收内存 
}
main(){
	//定义int类型的一级指针变量iPoint 
	int* iPoint;
	func(&iPoint);
	printf("*iPoint===%d\n",*iPoint);//*iPoint===100  
	printf("*iPoint===%d\n",*iPoint);//*iPoint===100
	printf("*iPoint===%d\n",*iPoint);//*iPoint===100
	system("pause");
} 

内存分析图如下:

在这里插入图片描述

输出到控制台内容如下:
在这里插入图片描述
八、C语言中动态创建数组

#include<stdio.h>
#include<stdlib.h>
/**
	动态创建数组 
*/ 
main(){
	//动态数组的创建
	printf("请输入您要创建数组的长度:\n");
	//1.让用户输入一个长度
	int length;
	scanf("%d",&length);
	printf("您输入的数组长度为:%d\n",length);
	//2.根据长度,分配内存空间 
	int* iArray = malloc(length*4);
	//3.让用户把数组中的元素依次的赋值 
	int i;
	for(i=0;i<length;i++){
		printf("请输入iArray[%d]的值:",i);
		scanf("%d",iArray+i);
	}
	//4.接收用户输入扩展数组长度
	int suppLength;
	printf("请输入您要扩展数组的长度:\n");
	scanf("%d",&suppLength);
	printf("您要扩展数组的长度为:%d\n",suppLength);
	//5.根据扩展的长度重新分配空间 
	iArray = realloc(iArray,(length+suppLength)*4);
	//6.把扩展长度的元素让用户赋值
	for(i=length;i<length+suppLength;i++){
		printf("请输入iArray[%d]的值:",i);
		scanf("%d",iArray+i);
	}
	//7.输出数组
	for(i=0;i<length+suppLength;i++){
		printf("iArray[%d]的值==%d\n",i,*(iArray+i));
	} 
	system("pause");
} 

输出到控制台内容如下:

在这里插入图片描述

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

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

相关文章

【报错1】无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件。

报错&#xff1a;无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件。“e:/codeAll/webProject/Project/vue_ts/project727/node_modules/element-plus/dist/locale/zh-cn.mjs”隐式拥有 "any" 类型。 如果“element-plus”包实际公开了此模块&#x…

Run主启动类的详解

package com.kuang.HelloSpringBoot;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;//本身就是spring的一个组件,也就是注册的bean SpringBootApplication public class HelloSpringBootApplicati…

使用LangChain构建问答聊天机器人案例实战(二)

使用LangChain构建问答聊天机器人案例实战 逐行解读和验证全生命周期Prompting 现在我们使用GPT-4作为语言模型的驱动力,这个模型将成为整个应用程序的引擎,驱动整个应用程序运行,同时,应用程序也是基于Cpython去实现的,如图14-8所示,Pyodide是CPython到WebAssembly/Emsc…

教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023

1. 本篇适用范围与目的 1.1. 适用范围 严格使用 Vue3 TypeScript 的前端项目&#xff0c;包管理器默认使用 pnpm 构建工具使用 Vite4 使用原生 CesiumJS 依赖做应用开发 客户端渲染&#xff0c;因为我不太熟悉 Vue 的服务端渲染&#xff0c;有本篇的介绍后&#xff0c;熟悉…

06. 管理Docker容器数据

目录 1、前言 2、Docker实现数据管理的方式 2.1、数据卷&#xff08;Data Volumes&#xff09; 2.2、数据卷容器&#xff08;Data Volume Containers&#xff09; 3、简单示例 3.1、数据卷示例 3.2、数据卷容器示例 1、前言 在生产环境中使用 Docker&#xff0c;一方面…

在腾讯云服务器OpenCLoudOS系统中安装jdk

1. 创建jdk安装目录&#xff1a; /app/soft/jdk mkdir -p /app/soft/jdk 2. 将linux版本的jdk安装包上传至/app/soft/jdk 3. 解压jdk安装包 tar -zxvf jdk-8u341-linux-x64.tar.gz 4. 复制jdk安装路径 pwd查看jdk当前路径&#xff0c;得到jdk在系统中的安装路径 5. 配置系…

【力扣周赛】第 356 场周赛(数位DP)

文章目录 Q1&#xff1a;6917. 满足目标工作时长的员工数目&#xff08;简单枚举模拟题&#xff09;Q2&#xff1a;6900. 统计完全子数组的数目&#xff08;双指针滑动窗口&#xff09;Q3&#xff1a;6918. 包含三个字符串的最短字符串Q4&#xff1a;6957. 统计范围内的步进数字…

Vue没有node_modules怎么办

npm install 一下 然后再npm run serve 就可以运行了

AD20. 如何给元器件设计、添加3D模型

Altium Designer学习笔记 - 00.目录​​​​​​​ 零. 前言 本文以HF46F继电器为例展示设计、添加元器件3D模型的流程&#xff0c;其他元器件类似。 一. 操作步骤 从下图可以看到此时继电器还没有添加3D模型&#xff1a; 1. 获取元器件尺寸 这里通过查找元器件的数据手册可以…

el-select 无限下拉滚动加载数据

<template> <div> <el-form ref"saveParameter" :model"saveParameter" inline inline-message style"margin:10px" > <el-form-item label"供应商" prop"lngcustomerid"> <el-select v-model&q…

装饰器模式——扩展系统功能

1、简介 1.1、概述 对新房进行装修并没有改变房屋用于居住的本质&#xff0c;但它可以让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中&#xff0c;也有一种类似新房装修的技术可以对已有对象&#xff08;新房&#xff09;的功能进行扩展&#xff08;装…

【Linux命令200例】mattrib用于更改文件或者目录的属性的工具

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

Java的标记接口(Marker Interface)

Java中的标记接口&#xff08;Marker Interface&#xff09;是一个空接口&#xff0c;接口内什么也没有定义。它标识了一种能力&#xff0c;标识继承自该接口的接口、实现了此接口的类具有某种能力。 例如&#xff0c;jdk的com.sun.org.apache.xalan.internal.xsltc.trax.Temp…

SqlServer读写分离对等发布

SqlServer读写分离对等发布: 对等发布支持多主复制。发布服务器将事务流式传输到拓扑中的所有对等方。所有对等节点可以读取和写入更改,且所有更改将传播到拓扑中的所有节点。 注意点: 1.各服务器的数据库名字要保证一样。 2.发布名称必须保持一致。 3.各服务器必须都是…

06-MySQL-基础篇-SQL之DCL语句

SQL之DCL语句 前言DCL 管理用户查询用户创建用户修改用户密码删除用户说明 权限控制常见权限描述查询权限授予权限撤销权限说明 前言 本篇来学习下SQL中的DCL语句 DCL DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权…

【VSCode部署模型】导出TensorFlow2.X训练好的模型信息

参考tensorflow2.0 C加载python训练保存的pb模型 经过模型训练及保存&#xff0c;我们得到“OptimalModelDataSet2”文件夹&#xff0c;模型的保存方法(.h5或.pb文件)&#xff0c;参考【Visual Studio Code】c/c部署tensorflow训练的模型 其中“OptimalModelDataSet2”文件夹保…

测试测试用例方法篇

测试|测试用例方法篇 文章目录 测试|测试用例方法篇1.测试用例的基本要素&#xff1a;测试环境&#xff0c;操作步骤&#xff0c;测试数据&#xff0c;预期结果…2.测试用例带来的好处3.测试用例的设计思路&#xff0c;设计方法&#xff0c;具体设计方法之间的关系**设计测试用…

Zabbix监控ActiveMQ

当我们在线上使用了ActiveMQ 后&#xff0c;我们需要对一些参数进行监控&#xff0c;比如 消息是否有阻塞&#xff0c;哪个消息队列阻塞了&#xff0c;总的消息数是多少等等。下面我们就通过 Zabbix 结合 Python 脚本来实现对 ActiveMQ的监控。 一、创建 Activemq Python 监控…

springboot创建并配置环境(四) - 配置扩展属性(下集)

文章目录 一、介绍二、对contributors中的配置属性进行处理三、处理contributors中的配置属性1. 解析配置文件位置和资源2. 加载配置属性 四、确定当前运行环境激活的profile1. 获取附加的addtionalProfiles2. 获取spring.profiles.include定义的配置3. 获取spring.profiles.ac…

互斥量 的初识

Q: 什么是互斥量&#xff1f; A: 在多数情况下&#xff0c;互斥型信号量和二值型信号量非常相似&#xff0c;但是从功能上二值型信号量用于同步&#xff0c; 而互斥型信号量用于资源保护。 互斥型信号量和二值型信号量还有一个最大的区别&#xff0c;互斥型信号量可以有效解决…