c语言指针详解下

news2025/1/18 17:04:57

指针下

1 指针与字符串

int main01()

{

//指针与字符串

char  a[] = "helloworld";//定义了一个字符数组,字符数组内容为helloworld\0

//定义一个指针用来保存数组首元素的地址

char  * p = a;

printf("%s\n",p);//%s打印一个字符串,要的是首个字符的地址

printf("%s\n", p + 2);

printf("%c\n",*(p+3));

*p = 'm';

printf("%s\n", p);

//a++

p++;

*p = 'o';

printf("%s\n", p);

//printf("%d\n",sizeof(a));//11

//printf("%d\n", sizeof(p));//4

//printf("%d\n", strlen(a));//

//printf("%d\n", strlen(p));//

system("pause");

return 0;

}

2 字符串常量

“hello” 字符串常量是不可以改变的,存在文字常量区

在使用时.双引号""代表取这个字符串首元素的地址

char  *p = "hello";  //代表将字符串常量的地址赋值给指针p

int main()

{

char  a[] = "helloworld";//定义了一个字符数组,字符数组内容为helloworld

//定义一个指针用来保存数组首元素的地址

char  * p = a;

p = "abcdef";//字符串常量存文字常量区,""在使用时,取的是字符串首元素的地址

//文字常量区的内容是不可以改变的

printf("%s\n",p);

printf("%d\n",sizeof(p));//4

printf("%d\n", sizeof("abcdef"));//7

printf("%d\n", strlen(p));//6

printf("%d\n", strlen("abcdef"));//6

*p = 'm';

printf("%s\n",p);

system("pause");

return 0;

}

3 字符指针作为形参

char * my_strcat(char * src, char *dst)

{

int n = strlen(src);

int i = 0;

while (*(dst + i) !=  0)

{

*(src+n+i) =   *(dst + i);

//src[n+i] = dst[i] ;

i++;

}

*(src + n + i) = 0;

return src;

}

int main()

{

char  str1[128] = "hello";//hello123456\0

char str2[128] = "123456";

my_strcat(str1,str2);

printf("%s\n",my_strcat(str1, str2));

system("pause");

return 0;

}

4 const修饰的指针变量

int main()

{

char  buf[] = "hello";

char  str[] = "acbg";

const char  *p = buf;//const修饰指针,不能通过指针修改指针所指向的空间内容

//*p = 'b';  err  不能通过p指针修改那块空间的内容

char  * const  k = buf;//指针变量k初始化之后不能改变k指针变量本身的指向

//      k = "world"; err

//      k = str; err

system("pause");

return 0;

}

5 字符指针数组


//字符指针数组

//是一个数组,每一个元素是字符指针

int main()

{

/*char *p1 = "heihei";

char *p2 = "haha";

char *p3 = "xixi";*/

//char *num[3] = { p1,p2,p3};

char *num[3]={ "heihei" ,"haha","xixi"};

//定义一个指针保存num数组首元素的地址   &num[0]  num

char **p = num;

for (int i = 0; i < 3; i++)

{

//      printf("%s\n",*(p+i));

printf("%s\n", p[i]);

}

printf("%c\n",*(*(p+1)+3));// *(p[1]+3)   == p[1][3]

//for (int i = 0; i < 3; i++)

//{

//      printf("%s\n",num[i]);

//}

//printf("%c\n",*num[0]);//

//printf("%c\n", *(num[1] + 1));

//printf("%c\n", *(num[2]+2));

system("pause");

return 0;

}

在这里插入图片描述

6 字符指针数组作为main函数的形参

int  main(int  argc,char *argv[])

argc  是执行可执行程序是的参数个数

argv 是一个字符指针数组,保存的是参数(字符串)的首元素地址

//.*.exe    hello   123456

//char *argv[] = { ".*.exe",    "hello"   "123456" };

int main(int  argc,char *argv[])

{

/*printf("%d\n",argc);

printf("%s\n", argv[0]);

printf("%s\n", argv[1]);

printf("%s\n", argv[2]);

printf("%s\n", argv[3]);*/

for (int i = 0; i < argc; i++)

{

printf("%s\n", argv[i]);

}

system("pause");

return 0;

}

7 字符串处理函数

strcpy

char str1[128]

char str2[128]

strcpy(str1,str2);//将str2的字符拷贝至str1数组中,注意,str2遇到\0结束,会将\0拷贝至str1

int main()

{

char  str1[128] = "heiheihaha";

char str2[128] = "world";

strcpy( str1 ,  str2);

printf("%s\n",str1);

system("pause");

return 0;

}

strcpy

char str1[128]

char str2[128]

strncpy(str1,str2,n);//将str2中的前n个字符拷贝至str1中,如果拷贝时不足n个,遇到\0拷贝结束

int main()

{

char  str1[1024] = "";//wo\0\0\0      wo\0rl

char str2[128] = "wo\0rldhello";

//strcpy( str1 ,  str2);

strncpy(str1,str2,5);

//      printf("%s\n",str1);

for (int i = 0; i < 5; i++)

{

printf("%d ",str1[i]);

}

system("pause");

return 0;

}

strcat

strcat(str1,str2)//将str2字符数组中的字符连接到str1字符数组中,遇到\0结束

strncat(str1,str2,n)//将str2字符数组中的n个字符连接到str1字符数组中,遇到\0结束

int main()

{

char  str1[1024] = "123456";//wo\0\0\0      wo\0rl

char str2[128] = "worldhello";

//strcat(str1,str2);//将str2的字符串拷贝到str1字符串的后面

strncat(str1, str2,5);

printf("%s\n",str1);

system("pause");

return 0;

}

strcmp

注意: 比较时遇到\0结束比较

int main()

{

char  str1[] = "a\0bcdef";

char str2[] = "a\0cdrrr";

//str1数组中和str2数组拿出一个元素进行比较,相等继续往后比较

//比较的是字符的ascii值

//如果str1> str2  返回值等于1

//如果str1==  str2  返回值等于0

//如果str1 <str2  返回值等于 - 1

//printf("%d\n",strcmp(str1,str2));

printf("%d\n", strncmp(str1, str2,3));

system("pause");

return 0;

}

sprintf:  组包函数

int  len = sprintf(buf,"格式","数据");//将数据安装格式组包,存放在数组buf中,

sprintf函数的返回值是组完包的有效长度

int main()

{

int  year = 2018;

int  month = 10;

int day = 20;

char buf[1024] = "";

//printf("year=%d month=%d day=%d \n",year,month,day);

int len = sprintf(buf,"year=%d %cmonth=%d day=%d \n",year, 0,month, day);

//printf("%d\n",strlen(buf));

printf("len=%d\n",len);

printf("buf=[%s]",buf);

system("pause");

return 0;

}

sscanf 拆包函数

sscanf(buf,"格式",数据);//将buf的内容格式化输出到数据

int main()

{

//%d    0-9的字符

int  year =0 ;

int  month = 0;

int day = 0;

char  buf[1024] = "beijing:2018:t:10:20";

//scanf("%d:%d:%d",&year,&month,&day);//从键盘按照相应的格式获取数据

sscanf(buf, "beijing:%d:t:%d:%d", &year, &month, &day);//从buf中按照`相应的格式获取数据

printf("%d %d %d\n",year,month,day);

system("pause");

return 0;

}

strchr

strchr(buf,ch)//在buf字符数组中查找字符ch出现的位置,如果成功返回此字符出现位置的地址,如果没有找到,返回NULL

char *my_strchr(char *p, char ch)

{

int i = 0;

while (p[i] != 0)

{

if (p[i] == ch)

return &p[i];

i++;

}

if (p[i] == 0)

return NULL;

}

int main()

{

char  str[] = "xixihellogworld";

char *p = strchr(str,'g');

//char  *p =my_strchr(str,'g');

printf("%s\n",p);

system("pause");

return 0;

}

strstr

strstr(str1,str2)//在str1字符数组中查找str2字符串出现的位置,并且返回这个位置的地址

char *my_strstr(char *str1, char *str2)

{

int i = 0;

while (str1[i] != 0)

{

if (str1[i] == str2[0])

{

if (0 == strncmp(str1 + i, str2, strlen(str2)))

return str1 + i;

}

i++;

}

if (str1[i] == 0)

return NULL;

}

int main()

{

char str1[] = "helloaabcfhaffjhafafha";

char str2[] = "abc";

//在str1中查找str2字符出现的位置

//先找a字符,如果找到了a字符,在比较

char *p = strstr(str1,str2);

printf("%s\n",p);

system("pause");

return 0;

}

strtok:

int main()

{

char str[] = "15080015225&bangquan#82263&123456";

char *p[10] = {NULL};//初始化指针数组元素全部为NULL

//strtok

//char *p1 = strtok(str,"#");//在str1中将#切割,返回切割前面的字符串

//printf("%s\n",p1);

//char *p2 = strtok(NULL,"#");

//printf("%s\n",p2);

//char *p3 = strtok(NULL, "#");

//printf("%s\n", p3);

int i = 0;

do {

if(i == 0)

p[i] = strtok(str, "#&");

else

p[i] = strtok(NULL, "#&");

//i++;

} while ( p[i++] != NULL);//p[i] != NULL   i=i+1 如果strtok的返回值等于NULL,代表切割完毕

i = 0;

while (p[i] != NULL)

{

printf("%s\n",p[i++]);

}

system("pause");

return 0;

}

atoi : 将字符串转整数

atof: 将字符串转float类型的数据

int  n = atoi(需要转的字符串)

8 字符串处理案例

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int main()

{

char  buf[] = "abcdefg";

char *start = buf;

char *end = &buf[strlen(buf) - 1];

while (end > start)

{

char ch = *end;

*end = *start;

*start = ch;

end--;

start++;

}

system("pause");

return 0;

}

int main02()

{

char buf[] = "    hello world     ";//hello world

char num[128] = "";

if (buf[0] == 0)

return;

char * start = buf;

char *end = &buf[strlen(buf) - 1];//end指向最后一个字符

//找到第一个不是空格的位置

while (*start == ' ' &&  *start != 0)

{

start++;

}

while (*end == ' '  &&  end != start)

{

end--;

}

printf("%d\n",end-start+1);

strncpy(num,start,end-start+1);

printf("num=%s\n",num);

system("pause");

return 0;

}

int  strstr_num(char *src, char *dst)

{

int i = 0;

char *p = src;

int n = 0;

do

{

p = strstr(p, dst);

//p = strstr(p+strlen(dst), dst);

if (p != NULL)//如果查找返回的地址不等于NULL,代表找到了

{

n++;

p = p + strlen(dst);

}

} while (p != NULL);

return n;

}

int main01()

{

char src[] = "hdaabcdhaodabcahdaabchdoahdoaabcjdahfaabc";

char dst[] = "abc";

int n = strstr_num(src, dst);

printf("%d\n", n);

system("pause");

return 0;

}

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

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

相关文章

使用Rust 构建C 组件

协议解析&#xff0c;这不就很快了&#xff0c;而且原生的标准库红黑树和avl 树支持&#xff0c;异步tokio 这些库&#xff0c;编写应用组件就很快了 rust 标准库不支持 unix 的消息队列&#xff0c;但是支持 shm 和 uds&#xff0c;后者从多方面考虑都比&#xff0c;消息队列更…

flutter添加全局水印

效果&#xff1a; 可以直接引用&#xff1a;disable_screenshots: ^0.2.0 但是有时候直接引用会报错&#xff0c;可以不引用插件直接把下面的源码工具类放在项目里面 工具类源码&#xff1a; import dart:io; import dart:math;import package:flutter/cupertino.dart; impor…

oomall课堂笔记

一、项目分层结构介绍 controller层&#xff08;控制器层&#xff09;&#xff1a; 作用&#xff1a;负责输出和输入&#xff0c;接收前端数据&#xff0c;把结果返回给前端。 1.处理用户请求&#xff0c;接收用户参数 2.调用service层处理业务&#xff0c;返回响应 servi…

uniapp 打开文件管理器上传(H5、微信小程序、android app三端)文件

H5跟安卓APP 手机打开的效果图&#xff1a; Vue页面&#xff1a; <template><view class"content"><button click"uploadFiles">点击上传</button></view> </template><script>export default {data() {return…

【Linux】已安装 powerlevel10k,报错 command not found: p10k

问题描述 在配置 zsh 时&#xff0c;已经安装了 powerlevel10k&#xff0c;但是当尝试启动 Powerlevel10k 配置向导时&#xff0c;出现了以下错误&#xff1a; p10k configure zsh: command not found: p10k原因分析 出现这个错误的原因是因为 zsh 终端还没有加载最新的配置…

Kafka性能调优:高吞吐、低延迟的数据流

Apache Kafka作为一种高性能、分布式流处理平台&#xff0c;对于实时数据的处理至关重要。本文将深入讨论Kafka性能调优的关键策略和技术&#xff0c;通过丰富的示例代码为大家提供实际操作指南&#xff0c;以构建高吞吐、低延迟的数据流系统。 Broker 配置的优化 首先&#…

[全志Tina/Linux]全志在线生成bootlogo工具

一、需求 由于全志的bootlogo文件要求使用bmp格式的32位RGBA图像&#xff0c;经测试在使用不同版本的ps软件修图时&#xff0c;导出的bootlogo.bmp经常无法被全志uboot识别&#xff0c;因此使用在线工具转换。 二、操作 1、登录工具网站 https://online-converting.com/ima…

C++面试宝典第3题:找不同的数

题目 封装两个函数&#xff0c;分别完成下面的编码任务。 &#xff08;1&#xff09;在一个整型数组中&#xff0c;数字都是两两相同&#xff0c;只有一个不同&#xff0c;请编写代码&#xff0c;最快找出这个不同的数字。 &#xff08;2&#xff09;在一个整型数组中&#xff…

力扣78. 子集(java 回溯解法)

Problem: 78. 子集 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们易知&#xff0c;本题目涉及到对元素的穷举&#xff0c;即我们可以使用回溯来实现。对于本题目我们应该较为注重回溯中的决策阶段&#xff1a; 由于涉及到对数组中元素的穷举&#xff0c;即在每…

1、Redis变慢原因排查(上)

感觉Redis变慢了&#xff0c;这些可能的原因你查了没 &#xff1f;(上) Redis 作为一款业内使用率最高的内存数据库&#xff0c;其拥有非常高的性能&#xff0c;单节点的QPS压测能达到18万以上。但也正因此如此&#xff0c;当应用访问 Redis 时&#xff0c;如果发现响应延迟变…

Docker架构及常用的命令

一、初识Docker 1、 docker是一个快速交付应用、运行应用的技术&#xff0c;具备下列优势&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以…

Redis保证高可用的三种方式

Redis保证高可用主要有三种方式&#xff1a;主从、哨兵、集群。 主从复制了解吗&#xff1f; Redis主从复制简图 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Redis 服务器。前者称为 主节点(master)&#xff0c;后者称为 从节点(slave)。且…

用Rust刷LeetCode之66 加一

66. 加一[1] 难度: 简单 func plusOne(digits []int) []int { length : len(digits) // 从最低位开始遍历&#xff0c;逐位加一 for i : length - 1; i > 0; i-- { if digits[i] < 9 { digits[i] return digits } d…

计算整数各位数字之和 C语言xdoj29

时间限制: 1 S 内存限制: 1000 Kb 问题描述: 假设n是一个由最多9位数字&#xff08;d9, …, d1&#xff09;组成的正整数。编写一个程序计算n的每一位数字之和 输入说明: 输入数据为一个正整数n 输出说明: 对整数n输出它的各位数字之和后换行 输入样例: …

排序算法——桶排序/基数排序/计数排序

桶排序 是计数排序的升级版。它利用了函数的映射关系&#xff0c;高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理&#xff1a; 假设输入数据服从均匀分布&#xff0c;将数据分到有限数量的桶里&#xff0c;每个桶再分别排序&#xff08;有可能再使…

C/C++,数字序列——计算伯努利数(Bernoulli Number)的计算方法与源程序

1 文本格式 typedef long long ll; const int maxn 10000; const int mod 1e9 7; ll B[maxn]; // 伯努利数 ll C[maxn][maxn]; // 组合数 ll inv[maxn]; // 逆元&#xff08;计算伯努利数&#xff09; void init() { // 预处理组合数 for (int i 0;…

PHPstudy小皮的数据库打开失败问题解决

如果你的MYSQL服务启动后停止&#xff0c;多次重启依然无法解决的情况下&#xff0c;大概率是和本地mysql冲突了 但是&#xff0c;千万不要卸载掉本地mysql&#xff0c;只需要在服务中停止本地mysql即可 将此服务关闭&#xff0c;小皮的mysql即可使用

AI助力智慧农业,基于DETR【DEtection TRansformer】模型开发构建田间作物场景下庄稼作物、杂草检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

学会使用这个魔法棒,再也不用在容器里安装乱七八糟的命令工具了!

在构建镜像的时候&#xff0c;我总是倾向于极简构建&#xff0c;一切没有必要的软件包都不安装&#xff0c;以此来缩小镜像的容量。但是这种做法为后续运维带来了一些困难&#xff0c;如在日常查询、排查问题的时候发现很多命令用不了&#xff0c;不得不在容器中安装额外的命令…

堆栈,BSS,DATA,TEXT

一、目标文件 首先目标文件的构成&#xff0c;Linux下就是.o 文件 编译器编译源码后生成的文件叫目标文件&#xff08;Object File&#xff09;。 目标文件和可执行文件一般采用同一种格式&#xff0c;这种存储格式为 ELF。 目前文件的内容至少有编译后的机器指令代码和数据&a…