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

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

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

1. char 使用相关

1.1 内存使用

  • 首先介绍一下C语言中的数据类型:
  • 下图给出了不同数据类型所占的字节数,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。以下列出了32位系统与64位系统的存储大小的差别(windows 相同):
cpp 复制代码
#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 指针

  • 指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
cpp 复制代码
//type *var_name;
char* data;  
char** data_locatioin
int* abc;
  • 举个例子:
cpp 复制代码
#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 是用于标记字符串的结束。
  • 声明/定义如下:
cpp 复制代码
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
char site[] = "RUNOOB";
cpp 复制代码
#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平台)。
cpp 复制代码
char ch = 'w';	//字符变量ch
char* pc=&ch;	//将字符变量ch的地址取出来,存在pc中。pc就被称为字符指针,类型就是char

--->
*pc = 'w';
  • 将字符串赋值给一个字符指针变量p,不是把字符串的内容赋值给pstr,而是把字符串首字符的地址赋给了pstr
cpp 复制代码
int main(){
    char* pstr="hello";
    printf("%s\n",pstr);
    return 0;
}
  • 打印:
  • 打印一个字符,用%c,p里面存的是a的地址,*p就是a。
  • 打印整个字符,遇到**"\0"**停止,用%s,p里面存的就是a的地址。直接把p放在后面,就从p存的地址处开始打印一个字符串,就能打印出"abcdef"。
cpp 复制代码
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类型的指针存储,下边给出调用方式:
cpp 复制代码
#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中的接口更新指针数据/图像数据
cpp 复制代码
//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);
}
------->解决!
相关推荐
xMathematics9 分钟前
计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形
开发语言·c++·qt·计算机图形学·cmake·opengl
ShiinaMashirol40 分钟前
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
java·算法
z_mazin2 小时前
反爬虫机制中的验证码识别:类型、技术难点与应对策略
人工智能·计算机视觉·目标跟踪
yuanManGan2 小时前
C++入门小馆: 深入了解STLlist
开发语言·c++
北极的企鹅882 小时前
XML内容解析成实体类
xml·java·开发语言
梁下轻语的秋缘2 小时前
每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)
c语言·c++·学习·蓝桥杯
BillKu2 小时前
Vue3后代组件多祖先通讯设计方案
开发语言·javascript·ecmascript
Python自动化办公社区2 小时前
Python 3.14:探索新版本的魅力与革新
开发语言·python
逐光沧海2 小时前
STL常用算法——C++
开发语言·c++
星火撩猿3 小时前
ubantu中下载编译安装qt5.15.3
开发语言·qt