Day7-指针专题二

1. 字符指针与字符串

C语言通过使用字符数组来处理字符串
通常,我们把char数据类型的指针变量称为字符指针变量。字符指针变量与字符数组有着密切关系,它也被用来处理字符串
初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中char str[] = "Hello World";char *p = str;
在C编程中,当一个字符指针指向一个字符串常量时,不能修改指针指向的对象的值char *p = "xiaoqiang";*p = 'h';  //错误,字符串常量不能被修改
/*案例1:通过创建两个字符数组,再用指针去控制其中一个数组的首字母,从而证明字符数组存的相同字符串是局部变量,存储在俩个独立的空间中 demo1*/
#include <stdio.h>
#include <ctype.h>
​
int main(int argc,char *argv[])
{char ch1[] = "xiaoqiang";char ch2[] = "xiaoqiang";
​char *p;p = ch1;
​if(isalpha(*p)){if(isupper(*p))*p = tolower(*p);else*p = toupper(*p);}printf("%p %s\n", p, p);
​p = ch2;printf("%p %s\n", p, p);return 0;
}
/*运行结果:
linux@ubuntu:~/C/day07$ gcc demo1.c -Wall
linux@ubuntu:~/C/day07$ ./a.out
0xbfe73e38 Xiaoqiang
0xbfe73e42 xiaoqiang
*/
/*案例2:通过创建两个相同的字符串常量,查看相同字符串常量的地址 demo2*/
#include <stdio.h>
#include <ctype.h>
​
int main(int argc,char *argv[])
{char *p1 = "xiaoqiang";char *p2 = "xiaoqiang";
​
​printf("&p1=%p p1=%p p1=%s\n",&p1, p1, p1);   //&p1=0xbf959d28 p1=0x8048520 p1=xiaoqiang
​printf("&p2=%p p2=%p p2=%s\n",&p2, p2, p2);   //&p2=0xbf959d2c p2=0x8048520 p2=xiaoqiang//俩字符指针变量地址不同,证明是俩个指针变量,指向的地址都相同,即字符串常量在静态存储区域,位于同一地址,所指结果也是相同的。字符串常量不可修改,但指针变量可以指向另外的地址。return 0;
}
/*测试结果:
linux@ubuntu:~/C/day07$ gcc demo2.c -Wall
linux@ubuntu:~/C/day07$ ./a.out
&p1=0xbf959d28 p1=0x8048520 p1=xiaoqiang
&p2=0xbf959d2c p2=0x8048520 p2=xiaoqiang
*/
/*案例3:在不使用任何函数的情况下实现俩个字符串的拼接 demo3*/
#include <stdio.h>
​
int main(int argc,char *argv[])
{char ch[100] = "xiaoqiang";char * q = " like xiaotian",* p;
​p = q;
​int i = 0;printf("ch:%s\n",ch);printf("q:%s\n",q);
​while(ch[i] != '\0')i++;
​while(*p != '\0'){*(ch+i) = *p;i++;p++;}
​*(ch+i) = *p;
​printf("ch+q,ch:%s\n",ch);printf("ch+q,q:%s\n",q);
​return 0;
}
/*打印结果:
linux@ubuntu:~/C/day07$ gcc demo3.c -Wall
linux@ubuntu:~/C/day07$ ./a.out
ch:xiaoqiang
q: like xiaotian
ch+q,ch:xiaoqiang like xiaotian
ch+q,q: like xiaotian
*/

2. 指针数组

所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合(即存储指针的数组或叫存储地址的数组),指针数组的一般说明形式:<存储类型> <数据类型> *<指针数组名>[<大小>];指针数组名表示该指针数组的起始地址
/*案例:利用指针数组存放二维数组的每个一维数组地址,要求输出二维数组,并求出二维数组所有元素的和*/
#include <stdio.h>
​
int main(int argc,char *argv[])
{int * p[3];int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};int i,j, sum;
​p[0] = a[0];p[1] = a[1];p[2] = a[2];sum = 0;
​for(i = 0;i < 3;i++){for(j = 0;j < 4;j++){   printf("%d ",*(p[i]+j));sum += *(p[i]+j);}puts("");}printf("sum=%d\n",sum);
​return 0;
}
/*测试结果:
linux@ubuntu:~/C/day07$ gcc demo4.c -Wall
linux@ubuntu:~/C/day07$ ./a.out
1 2 3 4 
5 6 7 8 
9 10 11 12 
sum=78
*/

3. 多级指针

把一个指向指针变量的指针变量,称为多级指针变量
对于指向处理数据的指针变量称为一级指针变量,简称一级指针变量,简称一级指针
而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针
二级指针变量的说明形式如下<存储类型> <数据类型> **<指针名>;
多级指针运算指针变量加1,是向地址大的方向移动一个目标数据。类似的道理,多级指针运算也是以其目标变量为单位进行偏移。比如,int **p;p+1移动一个int *变量所占的内存空间。再比如int **p,p+1移动一个int **所占的内存空间
多级指针和指针数组指针数组也可以用另外一个指针来处理

/*案例:用二级指针打印字符串*/
#include <stdio.h>
​
int main(int argc,char *argv[])
{char *ps[5] = {"New York city","Beijing city","Moscow city","London city","Paris city"};char **pps;int i;
​pps = ps;
​for(i = 0;i < 5;i++)printf("%s\n",*(pps+i));
​return 0;
}
/*运行结果:
linux@ubuntu:~/C/day07$ gcc demo5.c -Wall
linux@ubuntu:~/C/day07$ ./a.out
New York city
Beijing city
Moscow city
London city
Paris city
*/

4. void指针和const

4.1 void指针
void指针是一种不确定数据裂隙的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量
一般形式为:void * <指针变量名称>
对于void指针,在没有强制类型转换之前,不能进行任何指针的算术运算
作用:可以将更多种类的数据类型用一个指针去解决
/*案例测试:将俩个不同的数据类型 用同一个指针进行输出*/
#include <stdio.h>
​
int main(int argc,char *argv[])
{int m = 10;double n = 3.14;void * p;
​p = &m;   //p = (void *)&m;printf("p = %d\n",*(int *)p);
​p = &n;printf("p = %f\n",*(double *)p);
​return 0;
}
/*运行结果:
linux@ubuntu:~/C/day07$ gcc demo6.c -Wall
linux@ubuntu:~/C/day07$ ./a.out
p = 10
p = 3.140000
*/
/*案例2:使用void的指针遍历一维数组*/
#include <stdio.h>
​
int main(int argc,char *argv[])
{int a[] = {1,2,3,4,5,6,7,8,9};int i,n;void * p;p = a;n = sizeof(a)/sizeof(a[0]);for(i = 0;i < n;i++)printf("%d ",*((int *)p + i));puts("");return 0;
}
/*运行结果:
linux@ubuntu:~/C/day07$ gcc demo7.c -Wall
linux@ubuntu:~/C/day07$ ./a.out
1 2 3 4 5 6 7 8 9 
*/
4.2 const变量
作用:常量化变量的值
一般形式如下:conts <数据类型> 变量名 = [<表达式>];
常量化变量是为了使得变量的值不能改变
​
const修饰指针,常量化指针目标表达式
一般说明形式如下:const <数据类型> * <指针变量名称>[=<指针运算表达式>]
常量化指针目标是限制通过指针改变其目标的数值,但<指针变量>存储的地址值可以修改,只是不能修改这个地址所指向的值
​
常量化指针变量
一般说明形式如下:<数据类型> *const <指针变量名称>[= <指针运算表达式>]
使得<指针变量>存储的地址不能改变。但可以通过*<指针变量名称>修改指针所指向的值
​
const修饰谁,谁就不能修改

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

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

相关文章

独占电脑资源来执行一个应用

1. 背景 在人工智能时代&#xff0c;随着神经网络的发展&#xff0c;训练人工智能模型需要越来越多的硬件资源&#xff0c;例如&#xff0c;利用10万条棋局数据、使用一台PC电脑、完整地训练一次确定性神经网络五子棋模型&#xff0c;需要花费一年半的时间。随着训练数据的增长…

<PLC><HMI><汇川>在汇川HMI画面中,如何为UI设置全局样式?

前言 汇川的HMI软件是使用了Qt来编写的,因此在汇川的HMI程序编写过程,是支持使用qt的样式来自定义部件样式的,即qss格式。 概述 汇川的软件本身提供三个系统的style样式,我们可以直接使用,但是,如果系统提供的样式不符合你的需求,那么你可以对其进行修改,或者自己新建…

进程间通信与线程间通信的方法汇总

目录 一、进程间通信机制 管道(pipe)&#xff1a; 命名管道(FIFO)&#xff1a; 消息队列(MQ)&#xff1a; 信号量(semaphore)&#xff1a; 共享内存(shared memory)&#xff1a; 信号(signal)&#xff1a; 内存映射(mapped memory)&#xff1a; 内存映射和共享内存的区…

NFTScan 正式上线 ERC404 浏览器和 NFT API 数据服务

近日&#xff0c;NFTScan 团队正式对外发布了 ERC404 浏览器&#xff0c;将为 ERC404 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;帮助用户更方便地访问和分析 ERC404 相关的 NFT 数据&#xff0…

git使用总结

概述 简介 Git是一种代码托管技术&#xff0c;很多代码托管平台也是基于Git来实现的。 Git可以帮我们做到很多的事情&#xff0c;比如代码的版本控制&#xff0c;分支管理等。 网址 git官网&#xff1a;https://git-scm.com/ 版本控制系统【VCS】 可以完整保存项目的快照&#…

力扣Hot100-543二叉树的直径

给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5] 输出&a…

【Vue】权限控制

权限管理 分类&#xff1a; 页面权限功能(按钮)权限接口权限 vue3-element-admin 的实现方案 一般我们在业务中将 路由可以分为两种&#xff0c;constantRoutes 和 asyncRoutes。 constantRoutes&#xff1a; 代表那些不需要动态判断权限的路由&#xff0c;如登录页、404(或…

Skywalking 入门与实战

一 什么是 Skywalking? Skywalking 时一个开源的分布式追踪系统&#xff0c;用于检测、诊断和优化分布式系统的功能。它可以帮助开发者和运维人员深入了解分布式系统中各个组件之间的调用关系、性能瓶颈以及异常情况&#xff0c;从而提供系统级的性能优化和故障排查。 1.1 为…

嵌入式初学-C语言-八

#接嵌入式初学-C语言-七# 分支结构 分支结构&#xff1a;又被称之为选择结构 选择结构的形式 多分支 语法&#xff1a; if(条件1) { 语句1; } else if(条件2) { 语句2; } ... else { 语句n1; }案例&#xff1a; #include <stdio.h> int main() { // 需求&#xff…

Apache、nginx

一、Web 1、概述 Web&#xff1a;为⽤户提供的⼀种在互联⽹上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联⽹服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊天、购物…

线程的同步互斥

互斥 互斥保证了在一个时间内只有一个线程访问一个资源。 先看一段代码&#xff1a;三个线程同时对全局变量val进行--&#xff0c;同时val每自减一次其线程局部存储的全局变量 #include <iostream> #include <thread> #include <vector> #include <uni…

Stable Diffusion WebUI本地环境搭建

一、项目代码下载 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、环境配置 conda create --n stafu python3.10.6 实际上跟自己创建的环境没有关系&#xff0c;项目启动会自动复制这个环境&#xff0c;之后项目根据这个基础环境构建 也可以在自己…

C++高性能通信:图形简述高性能中间件Iceoryx

文章目录 1. 概述2. 支持一个发布者多个订阅者2.2 Iceoryx为何不支持多个发布者发布到同一个主题 3. Iceoryx的架构和数据传输示意图3.1 发布者与订阅者的通信机制3.2 零拷贝共享内存通信机制 4. 使用事件驱动机制4.1 WaitSet机制4.2 Listener机制 5. 已知限制6. 参考 1. 概述 …

ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20‘ 报错解决办法

1.查找 libstdc.so.6* find / -name libstdc.so.6*2.copy一个libstdc.so.6.0.19到/usr/lib64/下 cp /usr/lib64/libstdc.so.6 /usr/lib64/3.创建软连接 ln -sf /usr/lib64/libstdc.so.6.0.31 /usr/lib64/libstdc.so.6完毕&#xff01;

中电金信:云原生时代IT基础设施管理利器——基础设施即代码(IaC)

在数字化转型、零售业务快速发展、信创建设驱动下&#xff0c;应用架构、技术架构、基础架构都已向云原生快速演进&#xff0c;银行业IT基础设施管理产生了非常大的变化&#xff0c;当前银行业&#xff0c;正在开展新一轮的核心应用系统重构、基础平台统一建设等重点任务&#…

Linux网络:传输层协议TCP(二)三次挥手四次握手详解

目录 一、TCP的连接管理机制 1.1三次握手 1.2四次挥手 二、理解 TIME_WAIT 状态 2.1解决TIME_WAIT 状态引起的 bind 失败的方法 三、理解CLOSE_WAIT状态 一、TCP的连接管理机制 在正常情况下, TCP 要经过三次握手建立连接, 四次挥手断开连接 1.1三次握手 三次握手顾名思…

【设计模式】代理模式详解

1.简介 代理模式是常用的Java设计模式&#xff0c;该模式的特点是代理类与委托类共享相同的接口。代理类主要负责预处理消息、过滤消息、将消息转发给委托类&#xff0c;并在事后处理消息等。代理类与委托类之间通常存在关联关系&#xff0c;一个代理类对象与一个委托类对象关…

SpringBoot Mysql->达梦8 activiti6.0.0 项目迁移

全部源码&#xff1a;公众号搜索资小库&#xff0c;回复dm获取源码 1.整合达梦 1.1 达梦驱动下载 MyBatis-Plus 框架 | 达梦技术文档 (dameng.com) 1.2 数据迁移 怎么安装数据库&#xff0c;很多大佬有帖子&#xff0c;搜一下达梦先建立用户&#xff0c;使用DM管理工具 链…

SQL Server 数据误删的恢复

在日常的数据库管理中&#xff0c;数据的误删操作是难以避免的。为了确保数据的安全性和完整性&#xff0c;我们必须采取一些措施来进行数据的备份和恢复。本文将详细介绍如何在 SQL Server 中进行数据的备份和恢复操作&#xff0c;特别是在发生数据误删的情况下。假设我们已经…

使用visual studio编译C++项目时无法找到 enum中的某些项

vs 2017 编译一个cocos2dx 的老项目时&#xff0c;报错&#xff1a; 在项目中搜索关键字 ARMATURE_LOOP_COMPLETE&#xff0c;发现在文件EventType.h中是有定义的&#xff0c;是 enum Event 的一项&#xff0c;而且确认了报错的文件已经引入了这个头文件&#xff1a; 这太奇怪了…