Day 09

文章目录

    • 指针数组
    • 指针和函数
    • 技术名词解释
    • 技术细节
    • 课堂笔记

指针数组

#include<stdio.h>
int main()
{int a[3] = {0,1,2};//指针数组,它是数组,每个元素都是指针int *p[3];p[0] = &a[0];p[0] = a;p[1] = &a[1];p[1] = a+1;p[2] = &a[2];p[2] = a+2;//sizeof(p):3个元素,int*(32位)//3 * 4 = 12//sizoef(p[0]):第0给元素,int * = 4int n = sizeof(p)/sizeof(p[0]);int i =0;for(i = 0;i < n;i++){p[i] = &a[i]; //a+i}for(i = 0;i < n;i++){//printf("%d\n",*p[i])printf("%d\n", *(*(p+i)));//p[i]等价于*(p+i)}return 0;
}

指针和函数

通过函数交换两个变量

#include<stdio.h>
void swap(int m, int n)
{int tmp;tmp = m;m = n;n = tmp;printf("m = %d,n = %d\n",m,n);
}
int main()
{       int a = 11;int b = 22;swap(a,b);//值传递printf("a = %d,b = %d\n",a,b);return 0;
}     

地址传递

#include<stdio.h>
void swap(int *m, int *n)
{int tmp;tmp = *m;*m = *n;*n = tmp;
}
int main()
{int a = 11;int b = 22;//值传递,不管这个变量什么类型,只要是变量本身传递,就是值传递//swap(a,b);//值传递swap(&a,&b);  //地址传递,变量的地址printf("a = %d,b = %d\n",a,b);return 0;
}

 形参中的数组01

#include<stdio.h>
int main()
{int a[] = {1,-2,3,-4,5,-6,7,-8,9};int i = 0;int n = sizeof(a)/sizeof(*a);printf("排序前\n");for(i = 0;i < n;i++){printf("%d ", a[i]);}printf("\n");//冒泡排序int j = 0;int tmp;for(i = 0;i < n-1;i++){for(j = 0;j < n-i-1;j++){       if(a[j] > a[j+1])  //升序{tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;}}}printf("排序后\n");for(i = 0;i < n;i++){printf("%d ", a[i]);}printf("\n");

形参中的数组02

#include<stdio.h>
//1、形参中的数组,不是数组,它是普通指针变量
//2、形参数组:int a[100000],int a[],int *a对编译器而已,没有任何区别
//3、编译器都是当做int*处理
//4、形参中的数组和非形参数组区别:形参中的数组是指针变量,非形参数组就是数组
//void print array(int a[100000])
//void print array(int a[])
void print_array(int a[], int n)
{int i = 0;//64位系统,sizeof(a),a是指针变量,结果为8//sizeof(a[0])第0个元素,是int类型,结果为4/*int n = sizeof(a)/sizeof(a[0]);printf("sizeof(a) = %d\n". sizeof(a));printf("sizeof(a[0] = %d\n),sizeof(a[0])");*/for(i = 0;i < n;i++){printf("%d, ",a[i]); //等价于*(a + i)}printf("\n");//a = NULL;   //形参中的数组,不是数组,它是普通指针变量        
}
int main()
{int a[] = {1,-2,3,-4,5,-6,7,-8,9};//print_array(a);  //传递的是,数组的首元素地址,&a[0]//a = NULL;int n = sizeof(a)/sizeof(*a);print_array(a,n); //应该把数组元素个数传递过去return 0;
}

 返回局部变量的地址

#include<stdio.h>
int *fun()
{int a;  //Linux64位,不允许返回局部变量的地址return &a;
}
int main()
{int *p = NULL;p = fun(); //接受函数返回的地址    //到上一步使用完fun(),fun()内的a,自动释放,下面操作野指针*p = 100; //操作指针所指向的内存return 0;
}

返回全局变量的地址

#include <stdio.h>int a; // 明确注释全局变量的用途int *fun() {return &a; // 函数名更明确
}int main() {int *p = fun();*p = 100;printf("*p = %d, a = %d\n", *p, a); // 合并输出*(fun()) = 111;printf("a = %d\n", a);return 0;
}

指针和字符串

字符串打印说明

#include<stdio.h>
int main()
{char str[] = "hello mike";//1、%s,从首元素开始打印,直到结束符位置//2、%s,操作的是指针所指向的内容//printf("str = %s\n", str);//2、str是首元素地址,如果想打印str本身的值,%p,&x,&d,%oprintf("str = %p\n",str);  //一个个打印出来,地址//3、str代表第0个元素,它是char//printf("str3 = %s\n", *str);printf("str3 = %c\n", *str);int i = 0;while(str[i] != '\0')  //while(*(str+i) != '\0')){printf("%c",str[i]);i++;}printf("\n");return 0;
}

字符指针

#include<stdio.h>
int main()
{char str[] = "hello";str[0] = '1';*(str + 1) = '2';//printf("str = %s\n", str);  //12lloprintf("str = %s\n",&str[0] +1); //2lloprintf("str = %s\n",str+1); //2llo//定义一个指针,指向首元素char *p = NULL;p  = &str[0];p  = str; //数组名就是首元素地址*p = 'a';p++;  //p = p +1 *p = 'b';printf("str = %s\n", str); //ablloprintf("str = %s\n", p);  // &str[0]+1 //blloprintf("str = %s\n",p-1);return 0;
}

字符串拷贝问题

#include<stdio.h>
#include<string.h>
int main()
{char buf[100];char *p = buf;//1、p指向buf的首元素//2、strcpy()是给p所指向的内存拷贝内容,字符串拷贝了bufstrcpy(p,"hello mike abc");printf("p = %s, buf = %s\n",p,buf);return 0;
}
int main01()
{char *p;//1、不是给p变量拷贝内容//给p所指向的内存拷贝内容//3、P是野指针,给野指针所指向的内存拷贝内容,结果导致段错误strcpy(p, "hello mike abc");return 0;
}

 字符串拷贝函数

#include<stdio.h>
//void my_strcpy(char dst[].char src[])
void my_strcpy(char *dst, char *src)
{int i = 0;while(*(src+i)!='\0'){*(dst+i) = *(src+i);i++}//结束符*(dst + i) = 0;
int main()
{       char src[] = "hello mike";char dst[100];char *p = buf;my_strcpy(p,src);  //自定义拷贝函数printf("dst = %s\n",dst);return 0;
} 

const修饰的字符指针 

#include<stdio.h>
int main()
{char buf[] = "hello";char *p1 = buf;*p1 = 'a'; //改变指针所指向的内存p1 = NULL;//改变指针变量本身//const修饰*,指针所指向的内存不能修改const char *p2 = buf;//*p2 = 'a'; //errp2 = NULL; //okreturn 0;
}     

 字符串常量

#include<stdio.h>
void fun()
{printf("fun s2 = %p\n","hello mike");
}
int  main()
{//1、每个字符串都是一个地址,这个地址是指字符串首元素地址//2、字符串常量放在data区,文字常量区printf("s1 = %s\n","hello mike");printf("s2 = %s\n","hello mike");printf("s3 = %s\n","hello mike"+1);//fun();return 0;
}

 文字常量区不允许修改01

#include<stdio.h>
#include<string.h>
int main()
{//1、字符串常量就是字符串的首元素地址printf("s1 = %p\n","hello mike");char *p1 = "hello mike";printf("p1 = %p\n",p1);char *p2 = "hello mike";printf("p2 = %p\n",p2);//2、字符串常量,文字常量区的字符串,只读,不能修改printf("*p1 = %c\n",*p1); //读,ok//3、p1指向字符串常量,字符串常量为只读,不能修改//*p1 = 'a'; //修改 //errchar *p3 = "hello";//4、p3指向文字常量区,不能改strcpy(p3,"abc"); //errreturn 0;
}

  文字常量区不允许修改02

#include<stdio.h>
void fun(char *tmp)
{*tmp = 'a'; //err
}                   
int main()
{char *p = NULL; //p是变量"hello mike" //字符串常量,首元素地址p = "hello mike"; //p指向字符串//*p = 'a'; //err,指向文字区常量,文字常量区内容只读p = NULL; //okp = "hello"  //okchar *p2 = "abc";fun(p2); //p2的值,是“abc”首元素地址return 0;
} 

字符串常量初始化问题

#include<stdio.h>
int main()
{       //1、p指针保存了“hello”的地址//2、指针所指向的内存不能修改char *p = "hello";//1、把"hello"一个一个字符放在buf数组中//2、数组的元素可以修改char buf[] = "hello";return 0;
} 

main形参使用说明 

#include<stdio.h>//argv[]:它是数组,数组每个元素都是char*,每个元素都是字符地址
//argc:argv[]元素个数
//main()函数参数,需要用户传递
int main(int argc,char *argv[])
{int i =0;for(i = 0;i < argc;i++){printf("test = %s\n",argv[i]);}return 0;
}

 字符指针数组

#include<stdio.h>
//void fun(int a[])
//void fun(int a[100])
void fun()
{
}//void print_array(char * p[100],int n)
void print_array(char *p[], int n)
//void print_arrauy(char **p, int n)
{int i = 0;for(i = 0;i < n;i++){printf("%s\n",p[i]);}
}
int main()
{char *p1 = "hello";char *p2 = "abc";char *p3 = "mike";char *p[] = {"hello", "abc", "mike"};int n = sizeof(p)/sizeof(*p);int i = 0;for(i = 0;i < n;i++){printf("%s\n", p[i]);}return 0;
}

查找匹配字符串出现的次数


#include<stdio.h>
#include<string.h>
int main()
{char *p = "11abcd11122abcd333abcd3322abcd3333322qqq";int i = 0; //累加器char *tmp = NULL;while(1){//查找匹配字符串,如果找到,返回匹配字符串的地址,没有找到返回空tmp = strstr(p, "abcd");if(tmp == NULL){break;  //跳出循环}else //找到{i++; //累加//重新设置新的起点p = tmp + strlen("abcd");}}printf("出现abcd的次数为; %d\n", i);return 0;
}

两头堵类型

#include<stdio.h>
#include<string.h>
int main()
{char *p = "  123456789   ";char *start = p; //首元素地址char *end = p + strlen(p) - 1; //尾元素地址//从左往右while(*start == ' ' && *start != '\0'){start++;}while(*end == ' ' && end != p){end--;}int n = end-start+1;  //5-1=4,但是实际上元素由5个所以+1printf("n = %d\n", n);char buf[100]="aaaaaaaaaaa";strncpy(buf,start,n);buf[n] = 0; //结束符printf("buf = %s\n",buf);return 0;
}

课堂笔记

void fun(int b[10][10]); //ok
void fun(int **p); //err,二维数组不是二级指针int *fun(); //返回值是指针类型,指针函数0          数字0,和'\0'等价
'\0'
'0''0'字符'0',不是结束符,ascii为48char a[] = {'a', 'b'}; 
printf("%s\n",a); //乱码,没有结束符char a[10] = {'a', 'b'}; //后面自动补0
printf("%s\n",a); //正常char a[] = {'a', 'b', 0};
char a[] = {'a', 'b','\0'};
printf("%s\n",a);//正常char a[] = {'a','b','0'};
printf("%s\n",a); //乱码,没有结束符char buf[] = "hello"; //以字符串初始化,自动隐藏结束符'\0'

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

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

相关文章

Nginx — Nginx安装证书模块(配置HTTPS和TCPS)

一、安装和编译证书模块 [rootmaster nginx]# wget https://nginx.org/download/nginx-1.25.3.tar.gz [rootmaster nginx]# tar -zxvf nginx-1.25.3.tar.gz [rootmaster nginx]# cd nginx-1.25.3 [rootmaster nginx]# ./configure --prefix/usr/local/nginx --with-http_stub_…

计算机网络 用deepseek帮助整理的复习资料(一)

### 计算机网络基础知识整理 --- #### **一、网络类型** 1. **局域网 (LAN)** - **定义**&#xff1a;覆盖小范围&#xff08;如家庭、教室、公司&#xff09;。 - **特点**&#xff1a;高带宽、低延迟&#xff0c;设备通过交换机互联。 - **示例**&#xff1…

Linux SCP传输文件免密配置

文章目录 Linux SCP传输文件免密配置生成SSH密钥对将公钥复制到远程服务器测试SSH连接使用SCP免密传输文件可选配置带密码的秘钥连接处理使用 ssh-agent进行缓存管理&#xff08;该方式只能确保同一个回话中&#xff0c;多次传输只输一次密码&#xff09;使用 keychain&#xf…

数字电子技术基础(三十六)——利用Multisim软件实现3线-8线译码器

目录 1 手动方式实现3线-8线译码器 2 使用字选择器实现3线-8线译码器 现在尝试利用Multisim软件来实现3线-8线译码器。本实验目的是验证74LS138的基本功能&#xff0c;简单来说就是“N中选1”。 实验设计&#xff1a; &#xff08;1&#xff09;使能信号&#xff1a;时&am…

wait和notify : 避免线程饿死(以及votile内存可见性和指令重排序问题)

各位看官&#xff0c;大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习&#xff1a;wait和notify : 避免线程饿死&#xff08;以及votile内存可见性和指令重排序问题&#xff09; …

HarmonyOS 介绍

HarmonyOS简介 随着万物互联时代的开启&#xff0c;应用的设备底座将从几十亿手机扩展到数百亿IoT设备。全新的全场景设备体验&#xff0c;正深入改变消费者的使用习惯。 同时应用开发者也面临设备底座从手机单设备到全场景多设备的转变&#xff0c;全场景多设备的全新底座&am…

【视觉提示学习】3.28阅读随想

2109.01134 CoOp通过可学习的向量来建模提示的上下文词汇&#xff0c;这些向量可以用随机值或预训练的词嵌入进行初始化&#xff08;见图2&#xff09;。我们提供了两种实现方式&#xff0c;以处理不同性质的任务&#xff1a;一种是基于统一上下文&#xff08;unified context…

计算机求职面试中高频出现的经典题目分类整理

以下为计算机求职面试中高频出现的经典题目分类整理&#xff0c;涵盖技术核心与深度考察方向&#xff0c;答案要点已附解析思路&#xff1a; 一、数据结构与算法 链表操作 题目&#xff1a;反转链表&#xff08;迭代/递归实现&#xff09;考察点&#xff1a;指针操作、递归思维…

uniapp选择文件使用formData格式提交数据

1. Vue实现 在vue项目中,我们有个文件,和一些其他字段数据需要提交的时候,我们都是使用axios 设置请求头中的Content-Type: multipart/form-data,然后new FormData的方式来进行提交。方式如下: const sendRequest = () => {const formData = new FormData()formData…

BeanDefinition和Beanfactory实现一个简单的bean容器

目录 什么是 Springbean 容器 设计思路 图解 参考文章 开源地址 BeanDefinition 类 BeanFactory 类 测试类 什么是 Springbean 容器 Spring 包含并管理应用对象的配置和生命周期&#xff0c;在这个意义上它是一种用于承载对象的容器&#xff0c;你可以配置你的每个 Bea…

AI Agent开发大全第十四课-零售智能导购智能体的RAG开发理论部分

开篇 经过前面的一些课程,我们手上已经积累了各种LLM的API调用、向量库的建立和使用、embedding算法的意义和基本使用。 这已经为我们具备了开发一个基本的问答类RAG的开发必需要素了。下面我们会来讲一个基本问答类场景的RAG,零售中的“智能导购”场景。 智能导购 大家先…

向字符串添加空格

给你一个下标从 0 开始的字符串 s &#xff0c;以及一个下标从 0 开始的整数数组 spaces 。 数组 spaces 描述原字符串中需要添加空格的下标。每个空格都应该插入到给定索引处的字符值 之前 。 例如&#xff0c;s "EnjoyYourCoffee" 且 spaces [5, 9] &#xff0…

百人会上的蔚小理与「来的刚刚好」的雷军

这就是2025百人会上的蔚小理&#xff0c;努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么呢&#xff1f;站在蔚小理的肩上。 这就是2025百人会上的蔚小理&#xff0c;努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么…

解锁Nginx路由器匹配规则

引言 Nginx 无疑是一款备受瞩目的明星产品。它以其高性能、高可靠性以及出色的并发处理能力&#xff0c;在众多 Web 服务器和反向代理服务器中脱颖而出 &#xff0c;广泛应用于各类网站和应用程序中。据统计&#xff0c;超过 30% 的网站都在使用 Nginx 作为其 Web 服务器&…

传统策略梯度方法的弊端与PPO的改进:稳定性与样本效率的提升

为什么传统策略梯度方法&#xff08;如REINFORCE算法&#xff09;在训练过程中存在不稳定性和样本效率低下的问题 1. 传统策略梯度方法的基本公式 传统策略梯度方法的目标是最大化累积奖励的期望值。具体来说&#xff0c;优化目标可以表示为&#xff1a; max ⁡ θ J ( θ )…

Qwt入门

Qwt(Qt Widgets for Technical Applications)是一个用于科学、工程和技术应用的 Qt 控件库,提供曲线图、仪表盘、刻度尺等专业可视化组件。 1. 安装与配置 1.1 安装方式 源码编译(推荐): git clone https://github.com/qwt/qwt.git cd qwt qmake qwt.pro # 生成 Makef…

软考《信息系统运行管理员》- 6.1 信息系统安全概述

信息系统安全的概念 信息系统安全是指保障计算机及其相关设备、设施(含网络)的安全&#xff0c;运行环境的安全&#xff0c; 信息的安全&#xff0c;实现信息系统的正常运行。 信息系统安全包括实体安全、运行安全、信息安全和 人员安全等几个部分。 影响信息系统安全的因素…

Canvas实现旋转太极八卦图

Canvas实现旋转太极八卦图 项目简介 这是一个使用HTML5 Canvas技术实现的动态太极八卦图&#xff0c;包含了旋转动画和鼠标交互功能。项目展示了中国传统文化元素与现代Web技术的结合。 主要特点 动态旋转的太极图八卦符号的完整展示鼠标悬停暂停动画流畅的动画效果 技术实…

机器学习、深度学习和神经网络

机器学习、深度学习和神经网络 术语及相关概念 在深入了解人工智能&#xff08;AI&#xff09;的工作原理以及它的各种应用之前&#xff0c;让我们先区分一下与AI密切相关的一些术语和概念&#xff1a;人工智能、机器学习、深度学习和神经网络。这些术语有时会被交替使用&#…

打造高性能中文RAG系统:多轮对话与语义检索的完美结合

目录 1、引言 2、RAG系统的核心架构 3、对话理解&#xff1a;超越单轮问答 3.1、指代消解技术 3.2、话题跟踪与记忆 4、混合检索策略&#xff1a;兼顾精确与广泛 4.1、向量检索 关键词检索 4.2、重排序机制 5、性能优化&#xff1a;应对大规模文档 5.1、向量量化技术…