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);
}
------->解决!