Day7-指针专题二

news2024/9/9 4:00:33

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.coloradmin.cn/o/1960963.html

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

相关文章

TCP/UDP通信

1、TCP/IP四层模型 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff09;是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议&#xff0c;而是指一个由FTP、SMTP、TCP、UDP…

【Linux】make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

每期一个小窍门: 使用Gin 与 client-go 操作k8s (中)

本文承接上文 每期一个小窍门: 使用Gin 与 client-go 操作k8s &#xff08;上&#xff09; 后面应该还会有个下 应该是个operator的全程demo 项目结构如下 client.go package clientimport ("k8s.io/client-go/discovery""k8s.io/client-go/kubernetes"…

使用easypoi读取Excel模板

1、只读取一个脚本号Excel2、读取多个脚本号的sheet…Excel 1、只读取sheet0(只读取一个脚本号的Excel) 前言&#xff1a;引入pom文件 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</…

OV SSL证书申请指南

OV SSL证书除了验证域名所有权外还需要验证组织信息&#xff0c;这类证书适用于对公司官网、品牌、安全性等有较高程度要求的企业级用户。具体申请流程如下&#xff1a; 一 、注册账号 注册账号填写230919注册码即可获得大额优惠券和全程一对一技术支持https://www.joyssl.co…

网页速度如何优化?从10s到0.5s

如何排除网页速度慢的故障&#xff1f; 优化运行缓慢的网页涉及多个层面的改进&#xff0c;可分为硬件、前端和后台优化。下面是一份全面的指南&#xff1a; 01 硬件优化 服务器资源 升级服务器&#xff1a;确保服务器能为流量提供足够的资源&#xff08;CPU、内存、带宽等&a…

【Windows】Mountain Duck(FTP服务器管理工具)软件介绍

软件介绍 Mountain Duck是一款基于Cyberduck开发的应用程序&#xff0c;它允许用户通过FTP、SFTP、WebDAV、S3和OpenStack Swift等协议连接到云存储和远程服务器&#xff0c;并在本地文件浏览器中以熟悉的方式访问和管理这些文件。 功能特点 支持多种协议: Mountain Duck支持…

右键没有压缩选项

想压缩文件选中右键没有压缩选项。 打开任意rar文件 选择选项-》设置&#xff0c;添加到winrar到开始菜单即可

HTML+CSS+JavaScript实现烟花绽放的效果源码

源码 复制粘贴代码 在同级别下放一张图片fire.png接可以了 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

AI多模态模型架构之输出映射器:Output Projector

〔探索AI的无限可能&#xff0c;微信关注“AIGCmagic”公众号&#xff0c;让AIGC科技点亮生活〕 本文作者&#xff1a;AIGCmagic社区 刘一手 前言 AI多模态大模型发展至今&#xff0c;每年都有非常优秀的工作产出&#xff0c;按照当前模型设计思路&#xff0c;多模态大模型的…

QChart笔记6:显示点的值、显示点坐标值

在QChart笔记2: 添加鼠标悬停显示和格式处理_qchart 折线图 响应鼠标显示数据-CSDN博客上修改而来。 在笔记2中&#xff0c;通过鼠标悬停的方式显示了坐标轴Y的值&#xff0c;如果要一直显示应该怎么写呢&#xff1f;比如要达到下面的效果。 核心是这句&#xff1a; series1-…

Windows10安装——制作U盘启动盘(保姆级)

安装前准备&#xff1a; 一个不少于8G的U盘&#xff0c; 一个可以上网的windows电脑&#xff1b; 第一步&#xff1a;安装启动盘制作工具 首先我们下载启动盘制作工具&#xff0c; 官网网址&#xff1a;下载 Windows 10 (microsoft.com)&#xff1b; 百度网盘下载&#xf…

赛氪网受邀参加中国国际科技促进会第五届第五次常务理事扩大会议

2024年7月27日&#xff0c;环球赛乐&#xff08;北京&#xff09;科技有限公司&#xff08;以下简称“赛氪网”&#xff09;受邀参加了中国国际科技促进会第五届第五次常务理事扩大会议。此次会议汇聚了众多科技界的精英和专家&#xff0c;共同探讨科技发展的新方向&#xff0c…

【Mybatis】xml 配置文件

Mybatis的开发有两种方式&#xff1a; 注解XML 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。 如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置文件中。在Mybatis中使用XML映射文件方式开…

Cxx primer-chap10-Generic Algorithms

generic algorithms的解释&#xff1a;&#xff0c;具体而言iterator使得算法与容器类型无关&#xff1a;&#xff0c;但算法的实现成功与否有时依赖于&#xff08;element type&#xff09;元素类型&#xff1a;通用算法的实现依赖于iterator&#xff0c;具体而言algorithm –…

python windows环境部署

在官网安装www.python.org linux系统的只能编译安装 windows的可以直接安装 这里是windows安装 .3.9.6版本 一直下一步就可以&#xff0c;然后鼠标右键在按住shift用终端打开 输入py或者python验证一下是否安装成功 打开目录文件夹 在里面新建一下pip的文件夹&#xff0c;里…

OpenAI开发了一种新方法来教授AI模型与安全政策保持一致

OpenAI 宣布了一种新的方法来教授人工智能模型与安全政策保持一致&#xff0c;这种方法被称为"基于规则的奖励"&#xff08;Rules Based Rewards&#xff09;。据 OpenAI 安全系统负责人 Lilian Weng 介绍&#xff0c;基于规则的奖励&#xff08;RBR&#xff09;可以…

【研发日记】Matlab/Simulink技能解锁(十一)——Stateflow中的en、du、ex应用对比

文章目录 前言 项目背景 en类型 du类型 ex类型 组合类型 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(六)——六种Simulink模型架构》 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simul…

盘点适合新手使用的4个剪辑工具。

很多宝子们都觉得剪辑很难&#xff0c;想学习又觉得自己没有专业的剪辑知识指导&#xff0c;不好上手。那是因为不知道有这些工具&#xff0c;这4款专业的剪辑软件对新手来说简直就是福音。 1、福昕剪辑 直达链接&#xff1a;www.pdf365.cn/foxit-clip/ 这个软件的界面设置的…