Linux C基础(9)

news2024/11/23 12:44:58

1、指针的算术元素

总结

 p + n:p+n对于p向地址增大的方向移动n个数据
     实际的变化:p + sizeof(数据类型)*n
 p - n:p-n对于p向地址减小的方向移动n个数据
     实际的变化:p - sizeof(数据类型)*n
 p++:p向地址增大的方向移动1个数据
     实际的变化:p + sizeof(数据类型)
 p--:p向地址减小的方向移动1个数据
     实际的变化:p - sizeof(数据类型)
 p - q(p和q的数据类型相同):这两个指针之间相差的数据的个数
     实际变化:(p - q)/sizeof(数据类型)

注意

 (1)指针的算术运算只有在操作连续的内存空间的时候才有意义
 (2)p是指针变量,以上这些方法也适用于指针常量,但是++、--除外

1.2 为什么使用数组名[下标]就可以访问数组中的元素

总结

 (1)数组名代表的是数组首元素的地址,地址常量,不能对它进行++、-- ,a的数据类型:int *
 (2)数组名代表的是整个数组 sizeof(a)

1.3 通过指针常量来访问

 #include <stdio.h>
 void main()
 {
     int a[]={1,2,5,3,8,9,6};
     int *p = a;
     printf("p的起始地址:%d\n",p);//1703716
     printf("*p++ = %d\n",*p++);//1
     /*
 *和++的优先级相同,运算顺序从右向左,所以*p++就相当于*(p++);
 这里存在一个知识误区:本应该先执行括号内的p++,使p从指向a[0]变成指向a[1];
 但其实事实并非如此;事实是,对于直接对*p++的输出来说,第一步是运算*p,输出后,第二步再运算p++;
 需要注意的是:*和++对于p的运算,都是单独运算,比如第一步:*p就是对p所指向的地址进行取值,第二步:p++对于p所指向的地址+1个数据类型的字节数;
 */
     printf("*p++后的地址:%d\n",p);//1703720
     printf("*p的值是:%d\n",*p);//2
     printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);//1,2
 }

 *p++(先取值,再自加,地址自加,改变指针指向,所有指针常量不能自增)

 p++ : p = p + 1
 ++是有赋值操作的,所以p的值会被改变
 p+1
 访问p的下一个地址,因为没有对p的赋值操作,所以p值不会被改变。

1.4 通过指针变量来访问

1.5 数组的访问

1.6 易错点

案例1

printf()是一个右结合,从右往左

案例2

形参都是当作指针来执行的

案例3

字符串常量不能被修改,但是可以被访问

1.7 指针的指向没有发生改变

1.8 指针的指向发生改变

案例

 编写一子函数,实现字符串的链接
 指针函数:指的是函数的返回值是一个指针,比如我的函数返回的是一个指向整数int的指针,定义格式如下:
 ​
 int *p(int a,int b); //注意这里的*与P之间是没有括号的,所以含义是函数p(int,int)会返回一个(int *)指针

2、指针与二维数组

a+j=&a[j] -> *(a+j)=a -> *(&a[i]+j)=a -> *(*(a+i)+j)=a

总结

1、a、&a[0]、&a[0][0]的值是一样的,但是意义不一样
2、为什么a不是int **类型的
a+1移动了一个数组(12byte),如果是int **的话加1移动4个字节
3、a指向a[0],a[0]是一个一维数组,所以说a指向了一个一维数组

作业

以下都封装成子函数的形式(指针移动):
1、求一个字符串中有多少个空格
2、求字符串的长度
3、字符串的拷贝
4、字符串的比较
5、求指定字符在字符串中第一次出现的地址
6、求指定字符在字符串中最后一次出现的地址
7、
1----------字符数组的输入
2----------输出
3----------排序

1、求一个字符串中有多少个空格

#include <stdio.h>
#include <string.h>
#define N 30

int count(char * arr);

int main(void)
{
        int num= 0;
        char arr[N] = "h w h w h w";
        num = count(arr);
        printf("%d\n",num);
        return 0;
}

int count(char * arr)
{
        int i,num = 0;
        char *p = arr;
        for(i = 0;i<strlen(arr);i++)
        {
                if((int)*(p)==32)
                {
                        num++;
                }
                p++;
        }
        return num;
}

2、求字符串的长度

#include <stdio.h>
#include <string.h>
#define N 30

int str_long(char * arr);

int main(void)
{
        int i,j,num= 0;
        char arr[N] = "hwhwhw";
        num = str_long(arr);
        printf("%d\n",num);
        return 0;
}

int str_long(char * arr)
{
        int i,j,num = 0;
        char *p = arr;
        while(*p)
        {
                num++;
                p++;
        }
        return num;
}

3、字符串的拷贝

#include <stdio.h>
#include <string.h>
#define N 30

void str_cp(char * arr, char * str);

int main(void)
{
        char arr[N] = "hello";
        char str[N] = "ok";
        str_cp(arr,str);
        puts(arr);
        return 0;
}

void str_cp(char * arr, char * str)
{
        int i,j,num = 0;
        char *p = arr;
        char *pp = str;
        while(*pp)
        {   
                *p=*pp;
                p++;
                pp++;
        }   
        *p = '\0';
}

4、字符串的比较

#include <stdio.h>
#include <string.h>
#define N 30

int str_compare(char * arr, char * str);

int main(void)
{
        int result = 0;
        char arr[N] = "hxllo";
        char str[N] = "hallo";
        result = str_compare(arr, str);
        printf("%d\n",result);
        return 0;
}

int str_compare(char * arr, char * str)
{
        int i,result = 0;
        char *p = arr;
        char *pp = str;
        while(*p && *pp)
        {
                if(*p != *pp)
                {
                        break;
                }
                p++;
                pp++;
        }
        result = *p - *pp;
        return result;
}

5、求指定字符在字符串中第一次出现的地址

#include <stdio.h>
#include <string.h>
#define N 30

char *str_first(char * arr, char str);

int main(void)
{
        char arr[N] = "hello";
        char str = 'e';
        char * result = str_first(arr, str);
        printf("%p\n",arr);
        printf("%p\n",result);

        return 0;
}

char *str_first(char * arr,char str)
{
        char * result = NULL;
        char * p = arr;
        while(*p)
        {
                if(*p == str)
                {
                        result = p;
                        break;
                }
                p++;
        }
        return result;
}

6、求指定字符在字符串中最后一次出现的地址

#include <stdio.h>
#include <string.h>
#define N 30

char *str_last(char * arr, char str);

int main(void)
{
        char arr[N] = "helle";
        char str = 'e';
        char * result = str_last(arr, str);
        printf("%p\n",arr);
        printf("%p\n",result);

        return 0;
}

char *str_last(char * arr,char str)
{
        char * result = NULL;
        char * p = arr;
        while(*p)
        {   
                if(*p == str)
                {   
                        result = p;
                }
                p++;
        }
        return result;
}

7、一个控制台

1----------字符数组的输入
2----------输出
3----------排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 30

void menu();
void input(char * a); 
void output(char * a); 
void swap(char * a); 

int main(void)
{
        char arr[30] = {'\0'};
        int fun = 0;
        while(1)
        {
                menu();
                printf("请选择功能");
                scanf("%d",&fun);
                switch(fun)
                {
                        case 1:
                                input(arr);
                                break;
                        case 2:
                                output(arr);
                                break;
                        case 3:
                                swap(arr);
                                break;
                        case -1: 
                                exit(0);
                }
        }

        return 0;
}

void menu()
{
        printf("功能菜单\n");
        printf("1-数组的输入\n");
        printf("2-数组的输出\n");
        printf("3-排序\n");
        printf("-1-exit\n");
}
//输入
void input(char * a)
{
        getchar();
        gets(a);
}
//输出
void output(char * a)
{
        //puts(a);
        for(int i=0;i<strlen(a);i++)
                printf("%c\n",*(a+i));
}
//排序
void swap(char * a)
{
        int i,j,tmp = 0;
        int num = 0;
        char * p = a;
        while(*p)
        {
                p++;
                num++;
        }
        printf("%d",num);
        for(i=1;i<num;i++)
        {
                char * pp = a;  
                for(j=0;j<num-i;j++)
                {
                        if(*(pp)>*(pp+1))
                        {
                                printf("2\n");
                                tmp=*pp;
                                *pp=*(pp+1);
                                *(pp+1)=tmp;
                        }
                        pp++;
                }
        }
}

*(++p):先加加,再取值

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

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

相关文章

【手把手教你】将python程序打包成exe可执行文件

1. 安装环境 pip install pyinstaller6.0.02. 打包文件 pyinstaller -D “要启动的文件名“.py比如我的命令就是&#xff1a;pyinstaller -D eval.py 执行完后&#xff0c;会生两个文件夹dist和bulib两个文件和一个xxx.spec文件 3. 删除生成的文件 删除生成的bulid和dist文…

Java实现调用openAI接口返回流式数据

一&#xff0c;添加依赖 <dependency><groupId>com.github.plexpt</groupId><artifactId>chatgpt</artifactId><version>4.0.7</version> </dependency>二&#xff0c;重写SseEmitter 改为UTF-8编码 import org.springframe…

TSINGSEE青犀智能分析网关工服识别算法,如何最大限度保障工人安全?

众所周知&#xff0c;TSINGSEE青犀智能分析网关算法繁多&#xff0c;大多数算法已经和大家讲解过了&#xff0c;今天就和大家聊一聊工服识别算法。工服识别算法一般应用于工地、化工、煤矿等场所&#xff0c;用来监督检测施工人员是否按照要求着工服&#xff0c;最大程度保障人…

助力网络安全攻防演练 | 中睿天下获国网蒙东电力数字化事业部感谢信

近日&#xff0c;中睿天下因积极协助和支撑国网蒙东电力数字化事业部在2023年国家网络安全专项演习期间的工作&#xff0c;有效保障了护网行动期间网络的安全稳定运行&#xff0c;因而获得了国网蒙东电力数字化事业部的高度认可&#xff0c;并向我司致书面表扬信&#xff0c;这…

Aria2 任意文件写入漏洞复现

漏洞描述 Aria2 是一款轻量级、多协议、多源下载工具&#xff08;支持 HTTP/HTTPS、FTP、BitTorrent、Metalink&#xff09;&#xff0c;内置 XML-RPC 和 JSON-RPC 接口。 我们可以使用 RPC 接口来操作 aria2 并将文件下载到任意目录&#xff0c;从而造成任意文件写入漏洞。 …

【CSS】transition、transform以及animation

1.CSS transition 介绍 通常当 CSS 的属性值更改后&#xff0c;浏览器会立即更新相应的样式。 在 CSS3 中加入了一项过渡功能&#xff0c;通过该功能&#xff0c;我们可以将元素从一种样式在指定时间内平滑的过渡到另一种样式&#xff0c;类似于简单的动画&#xff0c;但无需…

Android中Toast与Snack

1. Toast : 使用Toast类的makeText()方法创建Toast对象&#xff0c;makeText()方法有两个参数&#xff0c;第一个参数为显示Tosat的上下文环境&#xff0c;第二个参数为显示时长&#xff08; Toast.LENGTH_LONG 或 Toast.LENGTH_SHORT &#xff09;。 使用Toast类的show()方法…

lvgl 转换和使用新字体

一、背景 如果lvgl 提供的默认字体不符合我们的显示要求&#xff0c;我们可以在网上下载开源字体&#xff0c;或者利用系统自带&#xff08;注意版权问题&#xff09;的字体文件转换lvgl 能识别和调用的字体。 或者为了压缩存储空间&#xff0c;某些字体我们只需要个别字符&…

向量数据库:释放数据潜能,重塑信息世界

前言 想必各位开发者一定使用过关系型数据库MySQL去存储我们的项目的数据&#xff0c;也有部分人使用过非关系型数据库Redis去存储我们的一些热点数据作为缓存&#xff0c;提高我们系统的响应速度&#xff0c;减小我们MySQL的压力。那么你有听说过向量数据库吗&#xff1f;知道…

Docker本地部署Drupal并实现公网访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

多篇论文介绍-Wiou

论文地址 目录 https://arxiv.org/pdf/2301.10051.pdf 01 CIEFRNet&#xff1a;面向高速公路的抛洒物检测算法 02改进 YOLOv5 的 PDC 钻头复合片缺损识别 03 基于SimAM注意力机制的DCN-YOLOv5水下目标检测 04 基于改进YOLOv7-tiny 算法的输电线路螺栓缺销检测 05 基于改…

用友U8定制版在集简云:无需API即可集成客服系统和用户运营

无代码开发的新时代 在这个信息化、自动化的时代&#xff0c;无代码开发已经成为一种新的趋势。集简云就是这样的一款工具&#xff0c;可以轻松连接用友U8 定制版与近千款软件系统&#xff0c;无需开发、无需代码知识就可以打通各种软件之间的数据连接&#xff0c;构建自动化与…

【代码随想录】算法训练计划16

【代码随想录】算法训练计划04 1、111. 二叉树的最小深度 题目&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 思路&#xff1a; 用递归&#xff0…

HashMap源码分析(一)

存储结构 说明&#xff1a;本次讲解的HashMap是jdk1.8中的实现&#xff0c;其他版本可能有差异 内部是由Node节点数组组成&#xff0c;Node节点之间又由链表或红黑树组成。 图是网上找的&#xff0c;实在不想画 属性介绍 //存储数据的数组&#xff0c;初次使用时初始化&…

Opencv for unity 下载

GitHub - EnoxSoftware/VideoPlayerWithOpenCVForUnityExample: This example shows how to convert VideoPlayer texture to OpenCV Mat using AsyncGPUReadback. OpenCV for Unity | Integration | Unity Asset Store

【原创】java+jsp+servlet简单图书管理系统设计与实现

摘要&#xff1a; 图书管理系统是一个专门针对图书馆管理而设计的系统&#xff0c;它可以帮助图书管理员有效的对图书进行管理&#xff0c;在图书管理系统的设计中&#xff0c;首先要考虑的是系统的需求分析&#xff0c;该系统的设计与实现涉及多个方面&#xff0c;包括数据库…

ubuntu系统黑屏,且光标不闪烁

选择第二个&#xff0c;进入恢复模式 选择第二个&#xff0c;进入恢复模式 选择root 输入&#xff1a; startx然后就可以进入文本界面或者图形化界面了&#xff0c;如果不行&#xff0c;报错&#xff0c;可能需要需要下载这个包&#xff0c;把这个错误到网上搜索一下就可以找…

【广州华锐互动】人造卫星VR互动科普软件带你探索宇宙世界

在科学的广阔领域中&#xff0c;卫星科学和遥感技术占据了重要的位置。这些科学领域的进步&#xff0c;让我们有机会窥视宇宙的深处&#xff0c;揭示那些隐藏在星际之间的秘密。今天&#xff0c;我们要介绍一种新型的教学工具&#xff0c;即人造卫星VR互动科普软件&#xff0c;…

【凡人修仙传】预计开播倒计时,线下举办超前观影活动,隆重期待

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料凡人最新资讯&#xff0c;《凡人修仙传》这部备受期待的动漫作品&#xff0c;终于在新年之际宣布了定档日期。据悉&#xff0c;该动漫将于11月25日&#xff0c;也就是周六上午11点&#xff0c;与广大…

GPT出现了Something went wrong.

网络上的一种说法如下