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 指针
指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
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 ;
strcpy ( str3, str1) ;
printf ( "strcpy( str3, str1) : %s\n" , str3 ) ;
strcat ( str1, str2) ;
printf ( "strcat( str1, str2): %s\n" , str1 ) ;
len = strlen ( str1) ;
printf ( "strlen(str1) : %d\n" , len ) ;
return 0 ;
}
1.4 字符指针
指针就是个变量,用来存放地址,地址唯一标识一块内存空间;指针的大小是固定的4/8个字节(32平台/64平台)。
char ch = 'w' ;
char * pc= & ch;
-- ->
* 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" ;
char * pc= arr;
printf ( "%s\n" , arr) ;
printf ( "%s\n" , pc) ;
printf ( "%c\n" , * pc) ;
printf ( "%s\n" , pc+ 2 ) ;
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中的接口更新指针数据/图像数据
int DLL WINAPI imgGrab ( unsigned char * imgdata)
{
imgdata= getNextFrame ( ) ;
}
main ( )
{
uchar* data= new uchar[ h* w* c] ;
imgGrab ( data) ;
}
-- -- -- 如上方法调用时,在dll中图像数据正常,但是传递出来的图像数据全为0 ,异常-- -
-- -- > 然后做了如下修改:
int DLL WINAPI imgGrab ( unsigned char * * imgdata)
{
* imgdata= getNextFrame ( ) ;
}
main ( )
{
uchar* data= new uchar[ h* w* c] ;
imgGrab ( & data) ;
}
-- -- -- -> 解决!