C++ 之字符串、字符数组与字符指针(*、**)

news2024/11/26 6:20:33

C++ 之字符串、字符数组与字符指针(*、**)

  • 最近频繁使用字符串+指针,有时候想取值或者复制,常用到问题,在此总结一下
  • 字符串的处理、指针的使用
  • 长期更新版~

1. char 使用相关

1.1 内存使用

  • 首先介绍一下C语言中的数据类型:
    在这里插入图片描述
  • 下图给出了不同数据类型所占的字节数,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。以下列出了32位系统与64位系统的存储大小的差别(windows 相同):在这里插入图片描述
#include <stdio.h>
#include <float.h>
 
int main()
{
   printf("float 存储最大字节数 : %lu \n", sizeof(float));
   printf("float 最小值: %E\n", FLT_MIN );
   printf("float 最大值: %E\n", FLT_MAX );
   printf("精度值: %d\n", FLT_DIG );
   
   return 0;
}


**********output***********
float 存储最大字节数 : 4 
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

1.2 指针

  • 指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
//type *var_name;
char* data;  
char** data_locatioin
int* abc;
  • 举个例子:
#include <stdio.h>
 
int main ()
{
    int var_runoob = 10;
    int *p;              // 定义指针变量
    p = &var_runoob;
 
   printf("var_runoob 变量的地址: %p\n", p);
   return 0;
}

*********output***********
var_runoob 变量的地址: 0x7ffeeaae08d8

在这里插入图片描述

1.3 字符串

  • 字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。
  • 声明/定义如下:
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
char site[] = "RUNOOB";

在这里插入图片描述

#include <stdio.h>
 
int main ()
{
   char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
 
   printf("菜鸟教程: %s\n", site );
 
   char str1[14] = "runoob";
   char str2[14] = "google";
   char str3[14];
   int  len ;
   /* 复制 str1 到 str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );
 
   /* 连接 str1 和 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );
 
   /* 连接后,str1 的总长度 */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );
   return 0;
}

1.4 字符指针

  • 指针就是个变量,用来存放地址,地址唯一标识一块内存空间;指针的大小是固定的4/8个字节(32平台/64平台)。
char ch = 'w';	//字符变量ch
char* pc=&ch;	//将字符变量ch的地址取出来,存在pc中。pc就被称为字符指针,类型就是char

--->
*pc = 'w';
  • 将字符串赋值给一个字符指针变量p,不是把字符串的内容赋值给pstr,而是把字符串首字符的地址赋给了pstr
int main(){
    char* pstr="hello";
    printf("%s\n",pstr);
    return 0;
}
  • 打印:
  • 打印一个字符,用%c,p里面存的是a的地址,*p就是a。
  • 打印整个字符,遇到**“\0”**停止,用%s,p里面存的就是a的地址。直接把p放在后面,就从p存的地址处开始打印一个字符串,就能打印出“abcdef”。
int main() {
	 char arr[] = "abcdef";	//字符串存入arr数组里面
 	 char* pc=arr;//pc字符指针存放数组名,即首元素地址。
	 printf("%s\n", arr);   //abcdef
	 printf("%s\n", pc);    //abcdef
	 printf("%c\n",*pc);    //a 
     printf("%s\n", pc+2);  //cdef
     
     for(int i=0;i<7;i++)
     {
         printf("%c",*(pc+i));
     }
	 return 0;
}

***********output**********
abcdef
abcdef

2. 字符指针传参

  • 通常图像数据会被定义为uchar/unsigned char类型的指针存储,下边给出调用方式:
#include<opencv/opencv2.hpp>

int add(uchar*srcdata1,uchar*srcdata2,uchar*dstdata,int h,int w,int c)
{
    if(c==3)
    {
        cv::Mat src1=cv::Mat(h,w,CV_8UC3,srcdata1);
    }
    .....
}
  • 但是今天遇到了一个指针传参的问题,是通过C++的exe中调用C++封装的dll中的接口更新指针数据/图像数据
//DLL中函数定义:
int DLL WINAPI imgGrab(unsigned char* imgdata)
{
    imgdata=getNextFrame();
}

//exe中:
main()
{
    uchar* data=new uchar[h*w*c];
    imgGrab(data);
}
------如上方法调用时,在dll中图像数据正常,但是传递出来的图像数据全为0,异常---
---->然后做了如下修改:
//DLL中函数定义:
int DLL WINAPI imgGrab(unsigned char** imgdata)
{
    *imgdata=getNextFrame();
}

//exe中:
main()
{
    uchar* data=new uchar[h*w*c];
    imgGrab(&data);
}
------->解决!

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

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

相关文章

如何实时提取微信群收到的二维码图片?

10-4 在有些工作中&#xff0c;需要实时提取在微信中收到的二维码图片&#xff0c;比如微信里有一百个群&#xff0c;怎么才能知道这些群里发了二维码出来&#xff0c;要实现这样的功能&#xff0c;微信本身并不提供&#xff0c;但是可以通过一些其它技巧完成。 大概的原理是…

【教3妹学编程-算法题】购买物品的最大开销

3妹&#xff1a;2哥&#xff0c;听说你今天发工资啦&#xff1f; 请我吃饭怎么样&#xff0c;嘿嘿 2哥 : 切&#xff0c;你上周还发工资了呢&#xff0c;也没见你请我吃饭。 3妹&#xff1a;哎呀&#xff0c; 我的工资都用来双11 shopping了&#xff0c; 双11过后我都吃了1周土…

Mac电脑VSCode配置PHP开发环境

1.安装 PHP 首先&#xff0c;打开终端&#xff0c;安装 Homebrew&#xff0c;输入如下命令&#xff1a; $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装了 Homebrew 之后&#xff0c;你可以使用下面的…

优思学院|新版ISO9001:2015质量体系的优势(一)高阶结构

在全球商业环境中&#xff0c;不断提高产品和服务的质量至关重要。因此&#xff0c;国际标准组织&#xff08;ISO&#xff09;于2015年发布了更新的ISO 9001标准&#xff0c;即ISO 9001:2015质量体系标准。这一更新旨在适应不断变化的商业需求和挑战&#xff0c;为组织提供更强…

LeetCode - 27. 移除元素 (C语言,快慢指针,配图)

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路一&#xff1a;新开辟一个数组&#xff0c;空间复杂度O(N) 因为本题要求是空间复杂度O(1),所以这里只是列出思路1的思路和配图&#xff0c;并没有具体的实现代码&#xff0c;想必这对大家一定很简单…

云服务器windows service2022 部署git服务器

1 安装 下载地址gitblit 解压到你的一个目录,我这里给的是C:\gitblit 根据官网提示要下载jre or jdk7.0,这里建议使用下载jre (jdk 有时候运行出问题,或者2个都安装),自行安装java,这里不做环境配置的说明 ==================================== 进入c:\gitblit\data 目录里面…

场景图形管理-多视图多窗口渲染示例(4)

多视图多窗口渲染示例的代码如程序清单8-6所示 // 多视图多窗口渲染示例 void compositeViewer_8_6(const string &strDataFolder) {// 创建一个CompositeViewer对象osg::ref_ptr<osgViewer::CompositeViewer> viewer new osgViewer::CompositeViewer();// 创建两个…

人体状态检测YOLOV8 NANO

人体状态检测Y8N&#xff0c;能检测站立、奔跑、跌倒、坐下、蹲下五种状态&#xff0c;采用YOLOV8NANO训练&#xff0c;转换成ONNX&#xff0c;OPENCV DNN调用&#xff0c;支持C/PYTHON/ANDROID开发 人体状态检测Y8N

卷积神经网络(CNN)多种图片分类的实现

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#…

1116中信笔试

1116中信笔试 int, Integer的区别&#xff0c;相等如何判断结果Java的异常处理数据库的事务操作Redis的基本数据类型问了HashMap底层实现TCP协议MySQL的隔离级别创建线程的几种方式双亲委派机制 &#xff0c;它的优点linux命令&#xff08;查看线程&#xff09; java和数据库ha…

侧面多级菜单(一个大类、一个小类、小类下多个物体)

效果&#xff1a; 说明&#xff1a; 左右侧面板使用Animator组件控制滑入滑出。左侧面板中&#xff0c;左的左里面是大类&#xff0c;左的右有绿色的小类&#xff0c;绿色的小类下有多个真正的UI图片按钮。 要点&#xff1a; 结合了一点EasyGridBuilderPro插件的UI元素&…

应用层使用select进行检测连接状态

可以参考TCP连接保活机制来设计应用层的连接状态监测&#xff0c;同时需要注意到有两个关键点&#xff1a; 1.需要使用定时器&#xff0c;这可以通过使用 I/O 复用自身的机制来实现&#xff0c;这点可以先看一下《使用select实现定时任务》&#xff1b; 2.需要设计一个 PING-PO…

如何成为自信出色的演讲者?10条实用技巧助你登台亮相!

成为自信出色的演讲者需要长期练习和学习。以下是我总结的10条实用技巧&#xff1a; 了解你的观众 一个成功的演讲需要考虑观众的背景和需要。你需要了解他们的行业、兴趣和问题。这样可以帮助你调整内容和表达方式&#xff0c;让观众感兴趣并获得价值。你也可以事先收集一些…

狂神说笔记 快速入门Nginx

公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台的用户越来…

ES5中实现继承

本篇文章主要说明在ES5中最通用最兼容的继承实现方式&#xff0c;继承作为面向对象的三大特性之一&#xff0c;在js中实现继承对代码的简洁性&#xff0c;逻辑的连贯性都有很大的帮助。 实现思路 封装创建中间联系对象的函数 继承可以简单理解为建立子类和父类之间的联系&…

NEFTune: 通过简单的噪声提升指令精调效果

NEFTune指的是Noise Embedding Finetuning&#xff08;噪声嵌入精调&#xff09;&#xff0c;提出自论文&#xff1a;NEFTune: NOISY EMBEDDINGS IMPROVE INSTRUCTION FINETUNING。 NEFTune方法的原理仅使用一句话就可以描述清楚&#xff1a;在finetune过程的词向量中引入一些…

【chatglm3】(4):如何设计一个知识库问答系统,参考智谱AI的知识库系统,

0&#xff0c;视频地址 https://www.bilibili.com/video/BV16j411E7FX/?vd_source4b290247452adda4e56d84b659b0c8a2 【chatglm3】&#xff08;4&#xff09;&#xff1a;如何设计一个知识库问答系统&#xff0c;参考智谱AI的知识库系统&#xff0c;学习设计理念&#xff0c;…

图形学 -- Geometry几何

隐式 implicit 基于给点归类&#xff0c;满足某些关系的点 缺点&#xff1a;不规则表面难以描述&#xff01; algebraic surface 直接用数学公式表示&#xff1a;不直观&#xff01; Constructive Solid Geometry&#xff08;CSG&#xff09; 用简单形状进行加减 distance …

Android---Gradle 构建问题解析

想必做 Android App 开发的对 Gradle 都不太陌生。因为有 Android Studio 的帮助&#xff0c;Android 工程师使用 Gradle 的门槛不算太高&#xff0c;基本的配置都大同小异。只要在 Android Studio 默认生成的 build.gradle 中稍加修改&#xff0c;就都能满足项目要求。但是&am…

Android BitmapFactory.decodeResource读取原始图片装载成原始宽高Bitmap,Kotlin

Android BitmapFactory.decodeResource读取原始图片装载成原始宽高Bitmap&#xff0c;Kotlin fun getOriginalBitmap(resId: Int): Bitmap {val options BitmapFactory.Options()options.inJustDecodeBounds true //只解析原始图片的宽高&#xff0c;不decode原始文件装载到内…