c语言指针详解下

指针下

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";  //代表将字符串常量的地址赋值给指针pint main(){char  a[] = "helloworld";//定义了一个字符数组,字符数组内容为helloworld//定义一个指针用来保存数组首元素的地址char  * p = a;p = "abcdef";//字符串常量存文字常量区,""在使用时,取的是字符串首元素的地址//文字常量区的内容是不可以改变的printf("%s\n",p);printf("%d\n",sizeof(p));//4printf("%d\n", sizeof("abcdef"));//7printf("%d\n", strlen(p));//6printf("%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\0char 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; errsystem("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]  numchar **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 字符串处理函数

strcpychar str1[128]char str2[128]strcpy(str1,str2);//将str2的字符拷贝至str1数组中,注意,str2遇到\0结束,会将\0拷贝至str1int main(){char  str1[128] = "heiheihaha";char str2[128] = "world";strcpy( str1 ,  str2);printf("%s\n",str1);system("pause");return 0;}strcpychar str1[128]char str2[128]strncpy(str1,str2,n);//将str2中的前n个字符拷贝至str1中,如果拷贝时不足n个,遇到\0拷贝结束int main(){char  str1[1024] = "";//wo\0\0\0      wo\0rlchar 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;}strcatstrcat(str1,str2)//将str2字符数组中的字符连接到str1字符数组中,遇到\0结束strncat(str1,str2,n)//将str2字符数组中的n个字符连接到str1字符数组中,遇到\0结束int main(){char  str1[1024] = "123456";//wo\0\0\0      wo\0rlchar 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;}strchrstrchr(buf,ch)//在buf字符数组中查找字符ch出现的位置,如果成功返回此字符出现位置的地址,如果没有找到,返回NULLchar *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;}strstrstrstr(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, "#&");elsep[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 worldchar 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.hqwc.cn/news/255999.html

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

相关文章

MySql概述及其性能说明

MySQL是一种开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现属于Oracle公司。MySQL是最流行的开源数据库之一&#xff0c;被广泛地应用于Web开发中。MySQL提供了一个高度稳定可靠的数据存储解决方案&#xff0c;同时也可以很容易地跨平台运行。My…

软件中提示找不到msvcp140.dll无法继续执行代码,运行打开软件怎么弄

今天打开CAD提示找不到msvcp140.dll&#xff0c;这是一个很常见的问题&#xff0c;可能是由于系统缺少这个重要的动态链接库文件导致的。本文将介绍五个解决方法&#xff0c;以及msvcp140.dll文件的作用和丢失原因。 一、msvcp140.dll文件的作用 msvcp140.dll是Microsoft Vis…

一对多聊天

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

基于互一致性学习的半监督医学图像分割

Mutual consistency learning for semi-supervised medical image segmentation 基于互一致性学习的半监督医学图像分割背景贡献半监督学习 其它缓解过拟合的方法实验方法损失函数Thinking 基于互一致性学习的半监督医学图像分割 Medical Image Analysis 81 (2022) 102530 背…

Spring AOP带你了解整个流程,让面试官只能仰望

文章目录 一&#xff0c;介绍二&#xff0c;什么是JDK动态代理以及CGLIB代理三&#xff0c;源码流程图小结 一&#xff0c;介绍 提示&#xff1a;解析 A[“JavaConfig”] --> B[“EnableAspectJAutoProxy”]&#xff1a; 在Spring配置中&#xff0c;启用AspectJ自动代理功能…

【尘缘送书第五期】Java程序员:学习与使用多线程

目录 1 多线程对于Java的意义2 为什么Java工程师必须掌握多线程3 Java多线程使用方式4 如何学好Java多线程5 参与方式 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流量洪峰…

【C语言快速学习基础篇】之二控制语句、循环语句、隐式转换

文章目录 一、控制语句1.1、for循环1.2、while循环1.3、注意&#xff1a;for循环和while循环使用上面等同1.4、do while循环1.4.1while条件成立时1.4.2、while条件不成立时 C语言介绍 C语言是一门面向过程的计算机编程语言&#xff0c;与C、C#、Java等面向对象编程语言有所不同…

【微服务】springboot整合quartz使用详解

目录 一、前言 二、quartz介绍 2.1 quartz概述 2.2 quartz优缺点 2.3 quartz核心概念 2.3.1 Scheduler 2.3.2 Trigger 2.3.3 Job 2.3.4 JobDetail 2.4 Quartz作业存储类型 2.5 适用场景 三、Cron表达式 3.1 Cron表达式语法 3.2 Cron表达式各元素说明 3.3 Cron表达…

配置BFD状态与接口状态联动示例

1、BFD检测IP链路。 在IP链路上建立BFD会话&#xff0c;利用BFD检测机制快速检测故障。BFD检测IP链路支持单跳检测和多跳检测&#xff1a; BFD单跳检测是指对两个直连系统进行IP连通性检测&#xff0c;“单跳”是IP链路的一跳。 BFD多跳检测是指BFD可以检测两个系统间的任意路…

UDP通讯

本章节主要讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 接下来会一一讲解 UDP通信 主要的方向是一对多通信方式 UDP通信就是一下子可以通信多个对象&#xff0c;这就是UDP对比TCP的优势&am…

股市复苏中的明懿金汇:抓住新机遇

2023年对于明懿金汇来说是充满挑战与机遇的一年。面对复杂多变的市场环境&#xff0c;明懿金汇展现了其对市场趋势的敏锐洞察和卓越的策略适应能力。以下是该公司在2023年的主要投资策略和市场适应方式的详细分析。 随着2023年中国股市迎来反弹&#xff0c;明懿金汇迅速调整了…

Day04 Liunx高级系统设计4-信号

进程间通讯 引入 如何将 A 进程中的数据传入 B 进程呢 ? 我们要使用进程间通讯 概述 中文名 : 进程间通讯 英文名 :IPC 英文全称 :Inter Processes Communication 作用: 数据传输&#xff1a;一个进程需要将他的数据发送给另一个进程】 资源共享&#xff1a;多个进程可以…