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);
}
------->解决!
相关推荐
我是哈哈hh9 分钟前
HTML5和CSS3的进阶_HTML5和CSS3的新增特性
开发语言·前端·css·html·css3·html5·web
Dontla42 分钟前
Rust泛型系统类型推导原理(Rust类型推导、泛型类型推导、泛型推导)为什么在某些情况必须手动添加泛型特征约束?(泛型trait约束)
开发语言·算法·rust
Ttang231 小时前
Leetcode:118. 杨辉三角——Java数学法求解
算法·leetcode
喜欢打篮球的普通人1 小时前
rust模式和匹配
java·算法·rust
java小吕布1 小时前
Java中的排序算法:探索与比较
java·后端·算法·排序算法
tumu_C1 小时前
C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
c++·开源
杜若南星1 小时前
保研考研机试攻略(满分篇):第二章——满分之路上(1)
数据结构·c++·经验分享·笔记·考研·算法·贪心算法
路遇晚风1 小时前
力扣=Mysql-3322- 英超积分榜排名 III(中等)
mysql·算法·leetcode·职场和发展
金蝶软件小李1 小时前
深度学习和图像处理
图像处理·深度学习·计算机视觉