C++入门学习3-指针与字符数组,函数,指针数组

news2024/11/28 16:47:53

c++入门学习3

  • char型指针的使用
  • p
  • *p
  • *p++与p++
  • 与[整型指针指向整型数组]的区别
  • 指针与函数的使用
  • 指向函数的指针
  • 空指针调用函数
  • 从函数中返回指针
  • 一维数组和二维数组的类比
  • CHAR型指针数组
  • 关于&a

char型指针的使用

char型指针可以直接指向一个字符串,如下

char s[]={'a','b','c'};
char *p=s;
------------------------------
char *p="abc";
--------------------------------
string s="abc";
char *p=s;

//在指针p指向s之后,我们可以直接把p想象成一个内容为“abc”的字符串,方便我们理解

p

对于一个整型的数组来说
int *p=a;
cout<<p;  //输出的是第一个元素的地址;

但是对于字符型数组来说
char *p=s;
cout<<p;  //输出的却是一个字符串

【样例1】 输出
abcde
bcde
cde
de
e
可以用如下方式:

char s[]={'a','b','c','d','e','\0'};
char *p=s;

for(int i=0;i<5;i++)
cout<<p+i<<endl;
-----------------------------------------------------------
for(int i=0;i<5;i++)
cout<<&p[i]<<endl;

*p

*p是当前名为p的字符串的首字母:
【样例2】遍历字符串:

char s[]={'a','b','c','d','e','\0'};
char *p=s;

for(int i=0;i<5;i++)
cout<<*(p+i)<<endl;  //依次输出字符串的每个字母
-------------------------------------------------------------------------------
for(int i=0;i<5;i++)
cout<<*(&p[i])<<endl;

*p++与p++

char *p=s;
p++;  
*p++;

这两条语句在这种情况下是完全等效的,都是将指针p的指向向右移动一位:
值得一提的是

*p++其实等价于 *(p++)
在使用时一定要注意和 (*p)++进行区分,一个是对指针进行操作,另一个是对实际元素进行操作
这里不管是整型数组还是字符数组都是一样的

与[整型指针指向整型数组]的区别

int a[];
char s[];
-----------------------------------------------------------------
对于整型数组来说:
a是数组名,也是第一个元素的地址
同时&a[0],也是第一个元素的地址
*a和*(&a[0])是第一个元素的实际值
------------------------------------------------------------------
对于字符数组来说:
s是数组名,输出的是整个字符串,
&s[0],输出的也是整个字符串;
*s和*(&s[0])是字符串的第一个字符

不管是整型数组还是字符数组
a,a+1,a+2,a+3,a+4 a+n 等价于 &a[0],&a[1],&a[2],&a[3],&a[4],&a[n]

指针与函数的使用

常见的指针传参题目:
【样例3】用指针将字符串传入一个参数是指针的函数中

#include<iostream>
using namespace std;
int cnt(char *p)
{
    int i=0;
    int sum=0;

    while(p[i])
    {
        sum++;
        i++;
    }
    return sum;
}
int main()
{
    char s[]={'a','b','c','d','e','\0'};
    char *p=s;

    cout<<cnt(p);
}

这段代码的功能就是统计字符串中字符的个数
先定义个了一个指针指向字符串s,然后把指针传入函数中
在这个函数cnt中,你可以把指针p就想象成一个名为p的字符串即可


中间函数的部分也可以这样写:

int cnt(char *p)
{
    int i=0;
    int sum=0;
    while(*(p+i))
    {
        i++;
        sum++;
    }
    return sum;
}
//运用了上面 *(p+i)遍历字符串的知识

指向函数的指针

一个函数在被编译时也会被分配给一个入口地址,这个入口地址成为函数的指针

int sum(int x,int y);   //定义一个函数
int *p(int ,int );     //定义一个指向函数的指针
p=sum;               //让指针指向函数
int c,d;
(*p)(c,d);         //将参数c,d传入函数sum中

空指针调用函数

我们可以定义一个类型为空的指针,这个指针也可以起到指向函数的功能,但是在使用时,必须根据函数的返回类型和参数类型进行强制转化!

int plus(int x);  //定义一个函数,返回类型为int,参数类型为Int

void *p=NULL;
p=plus;           //指向函数
ans=(   (  int (*)(int) ) p   )(10);   //int (*)定义返回类型,(int)定义参数类型

从函数中返回指针

我们可以将指针传入函数中,然后让其指向一个函数内的变量,函数返回指针类型的值
这样虽然可以让一个指针正确的等于一个函数内变量的地址,但是函数结束后,函数内的变量会被销毁,虽然指针的值是一个正确的地址,但是地址的内容已经被销毁了,当输出地址所指的内容时,输出的是一个随机数

指针数组

int *p[4];

指向指针的指针

int *(*p);
------------------------
int **p;

一维数组和二维数组的类比

【样例4】:遍历所有的单词:

#include<iostream>
using namespace std;

int main()
{
    char s[5][10]={"i","am","a","good","student"};

    for(int i=0;i<5;i++)
    {
        cout<<*(s+i)<<endl;
    }
}

我们可以联想,在一维数组中
s+i,是字符串的递减,每次减去前面一位!
*(s+i)是遍历字符串
那么放到二维数组中
*(s+i)是不是就变成了遍历所有单词了呢!

如果先对一个二维数组进行 *(s+i),在对其进行 *(s+i),是不是就变成了遍历每个单词的每个字符了!

CHAR型指针数组

一个普通的char 型指针就可以指向一个字符串,
char *p="good";
--------------------------------------------------------------------------
那么一个指针数组的使用通过类比就可以知道:

char *p[]={"i","am","a","good","student"};

//在这种情况下,p[0],p[1],p[2],p[3],p[4],都分别是一个字符串

【样例5】使用指针数组对单词进行排序:

#include<iostream>
using namespace std;

void sort(char *p[],int n)
{
    char *temp;
    int i,j,k;

    for(int i=0;i<n-1;i++)
    {
        k=i;
        for(int j=i+1;j<n;j++)
        {
            if(strcmp(p[k],p[j])>0)
            k=j;
        }

        if(k!=i)
        {
            temp=p[i];
            p[i]=p[k];
            p[k]=temp;
        }
    }
}
int main()
{
    char *p[]={"i","a","am","student","good"};
    int n=4;
    sort(p,4);

    for(int i=0;i<5;i++)
    {
        cout<<p[i]<<endl;
    }
}

关于&a

int a[]={1,2,3};
char b={'a','b','c'};
-------------------------------
不管是在字符数组中,还是在整型数组中
int *p=&a; 和 char *p=&b;
这样的操作都是报错的,没办法编译,因为二者的维度不一样
--------------------------------------------
但是在一些题目中会使用强制转化的方式强行赋值:
char *p=(char *)(&a+1);

不管是对于整型还是字符型
(char *)(&p)都等价于 p ,等价于 &a[0];
但是当对其在内部进行+1时,指针并不是向后移动1个单位,而是向后移动n位(n为数组的大小)

所以 如果char * p=(char * )(&a+1),那么指针p的位置其实是在数组最后一个元素的下一位
如果 char * p=(char * )(&a+2),那么指针p的位置其实是在数组最后一个元素的下(n+1)位

【样例6】&a的使用:
在这里插入图片描述
输出:
在这里插入图片描述

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

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

相关文章

YOLO V7源码解析

1.命令行参数介绍 YOLO v7参数与YOLO v5差不多&#xff0c;我就直接将YOLO v5命令行参数搬过来了&#xff0c;偷个懒 --weights:初始权重--cfg:模型配置文件--data:数据配置文件--hyp:学习率等超参数文件--epochs:迭代次数-imgsz&#xff1a;图像大小--rect&#xff1a;长方…

多目标蜉蝣优化算法(MOMA)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

统计信号处理基础 习题解答6-6

题目 在本题中&#xff0c;我们扩展标量BLUE的结果。假定 其中θ 是待估计的未知参数&#xff0c;β 是已知常数&#xff0c;数据矢量x 的协方差矩阵是C 。在本题我们定义修正的线性估计量为 证明BLUE为&#xff1a; 另外求最小方差。 解答&#xff1a; 首先确保线性估计量是…

TFT-LCD显示中英文

TFT-LCD显示中英文 在前面编写了屏幕显示ASCII字符和字符串后&#xff0c;本次实现屏幕显示中文字符和中文字符串 中文字符取模 阴码&#xff0c;逐行式&#xff0c;逆向&#xff0c;十六进制数&#xff0c;C51格式&#xff0c; 输入要显示的中文字符&#xff0c;字体选择宋…

【数据结构】搜索二叉树(C++实现)

目录 一、二叉搜索树的概念 二、二叉搜索树的实现 2.1 节点的定义及构造 2.2 树的结构及功能展示 2.3 树的 Insert 2.4 树的中序遍历 2.4 树的 Find 2.5 树的 Erase 2.6 拷贝构造、赋值运算符重载、析构函数 三、递归实现树的增删查 3.1 递归实现 FindR 3.2 递归实…

Vue | Vue.js Composition API(二)

&#x1f5a5;️ Vue.js专栏&#xff1a;Vue.js 初级知识 Composition API(二) &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀…

嘿,朋友,其实 CSS 动画超简单的 - 时间函数篇(贝塞尔曲线、steps,看完还不懂算我输)

分配内存 - new 官方定义&#xff1a;new是一个分配内存的内置函数&#xff0c;第一个参数是类型&#xff0c;而不是值&#xff0c;返回的值是指向该类型新分配的零值的指针。 func new(Type) *Type 我们平常在使用指针的时候是需要分配内存空间的&#xff0c;未分配内存空间…

Java自定义注解

目录 一、什么是自定义注解 1&#xff09;Java注解简介 2&#xff09;Java注解分类 JDK基本注解 JDK元注解 自定义注解 如何自定义注解&#xff1f; 二、自定义注解 1&#xff09;获取类上注解值 2&#xff09;获取类属性上的注解属性值 3&#xff09;获取方法上的注…

WireShark 常用协议分析

WireShark 常用协议分析 1.3 实战&#xff1a;使用 WireShark 对常用协议抓包并分析原理 协议分析的时候 我们 关闭混淆模式&#xff0c; 避免一些干扰的数据包存在。 1.3.1 常用协议分析 - ARP 协议 地址解析协议 &#xff08;英语&#xff1a;Address Resolution Protocol&…

从内核角度看网络包发送流程

一、前置知识 1、RingBuffer结构详解 关于RingBuffer网上有很多说法&#xff0c;有的人说RingBuffer是系统启动时就预先申请好的一个环形数组&#xff0c;有的人说RingBuffer是在接收或发送数据时才动态申请的一个环形数组&#xff0c;那么到底RingBuffer的结构是怎么样的呢&…

《吉师作业》(2)之迟来的答案

前言 &#x1f340;作者简介&#xff1a;吉师散养学生&#xff0c;为挣钱努力拼搏的一名小学生。 &#x1f341;个人主页&#xff1a;吉师职业混子的博客_CSDN博客-python学习,HTML学习,清览题库--C语言程序设计第五版编程题解析领域博主 &#x1fad2;文章目的&#xff1a;我不…

初识C++(二)

简述 &#xff1a;本篇就缺省参数 和 函数重载 方面进行初步学习 &#xff0c;对比C语言学习C这两个语法&#xff0c;从而感受C在此方面对C语言进行的补充。 目录 缺省参数 什么是缺省参数 缺省参数的分类 缺省参数的应用 函数重载 什么是函数重载 函数重载的三种情况 支…

【JavaSE】函数or方法?方法的重载讲解

文章目录什么是方法如何定义方法方法的调用过程形参与实参的关系方法的重载为什么要重载重载的概念方法签名递归什么是方法 在C语言的学习中我们学习到了一个概念叫做函数&#xff0c;那么在Java的语法中有没有类似函数的东西的&#xff0c;答案是有的&#xff0c;但是在Java的…

strimzi实战之一:简介和准备

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于strimzi strimzi是一个开源项目&#xff0c;已加入了CNCF&#xff0c;官网地址&#xff1a;https://strimzi.io/借助strimzi&#xff0c;既能快速部署ka…

【生日快乐】搜索技术【深度优先搜索】 - 回溯法

搜索技术【深度优先搜索】 - 回溯法 回溯法是一种选优搜索法&#xff0c;按照选优条件深度优先搜索&#xff0c;以达到目标。当搜索到某一步时&#xff0c;发现原先的选择并不是最优或达不到目标&#xff0c;就退回一步重新选择&#xff0c;这种走不通就退回再走的技术被称为回…

如何用 Elasticsearch 实现 Word、PDF,TXT 文件的全文内容检索?

简单介绍一下需求 能支持文件的上传&#xff0c;下载 要能根据关键字&#xff0c;搜索出文件&#xff0c;要求要能搜索到文件里的文字&#xff0c;文件类型要支持 word&#xff0c;pdf&#xff0c;txt 文件上传&#xff0c;下载比较简单&#xff0c;要能检索到文件里的文字&am…

2022-ISCTF-部分MISC和PWN

misc 两层编码 第一层 sha256掩码爆破 第二层 base64解码找到key import string,sys from hashlib import sha256 from multiprocessing import Process from Crypto.Util.number import * from pwn import * import base64 from primefac import * context(log_leveldebug)…

【STL】容器 - set和map的使用

目录 前言 一.键值对 1.在SGI - STL中对键值对的定义: 2.make_pair 二.set 1.set的概念与注意事项 2.set的使用(常用接口) <1>.构造函数 <2>.迭代器与范围for <3>.插入和查找 <4>.删除erase <5>.计数count 三.map 1.map的概念与注…

洛谷千题详解 | P1012 [NOIP1998 提高组] 拼数【C++、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; C源码2&#xff1a; C源码3&#xff1a; Java源码&#xff1a; ---------------------------------------------------------…

element-ui upload图片上传组件使用

图片上传前端收集 数据 再调用接口发送到后端 组件标签内的参数&#xff1a; 参数说明类型可选值默认值action必选参数&#xff0c;上传的地址string——headers设置上传的请求头部object——multiple是否支持多选文件boolean——data上传时附带的额外参数object——name上传…