char* 类型使用总结

对于字符类型的指针真的有很多很多要注意的地方,而且他是String,CString等各种字符串相互转换的桥梁。

使用上稍不注意就会出错。

1.初始化

char* pstr = "hello world.";

这是一个指向字符串常量的指针,也就是说hello wrold.是不能被修改的。因为它存储在程序内存中的常量区。很多时候不注意就把pstr当做参数传递了。

所以我们初始化需要改变的字符串时应该使用:

char pstr[] = "hello world.";

此时的pstr也可以看做指针,hello world.是存储在临时堆栈上的,超过作用域后会自动销毁。但是其中的字符是可以改变的。

2.可以这样初始化:

char* pc = new char[20];
char* pc = {'c'};

但是不可以这样初始化:

char c[] = new char[20];

3. char p[] = "hello";和char p[] = {‘h’,‘l’,‘l’,‘o’};二者是不一样的。

4. 作为参数传递时的错误:

void Hello(char* p)
{
	p = (char*)malloc(sizeof(char)*5);
	for(int i =0 ;i<5;i++)
	   *p++ = 'c';
	cout << p << endl;
}
	//调用
        char* pc = NULL;
	Hello(pc);

这样调用是错误的,因为函数中的p只是pc的一个拷贝,此时相当于传递的是指针变量。程序运行会报错。

真确的做法是:

void Hello(char** p)
{
	*p = (char*)malloc(sizeof(char)*5);
	for(int i =0 ;i<5;i++)
	   *(*p+i) = 'c';
	cout << *p << endl;
}
	char* pc = NULL;
	Hello(&pc);

传递指针的指针。或者指针的地址。

5. 作为返回值时的情况:

char* GetChar()
{
	char p[] = "hello world.";
	return p;
}

返回值指向的栈内存指针,并且不是NULL。

6. 指针操作时的情况:

	char* c = new char[20]; //或char c[20];
        for (int i=0;i<20;i++)
	{
		*c++ = 'd';
	}
	cout << c << endl;

此时并不能真确输出c,因为c此时不再指向数组的首地址了。

应该将首地址保存起来,或者用另外一个指针指向它:

	char* c = new char[20];
	char* tc = c;
	for (int i=0;i<20;i++)
	{
		*tc++ = 'd';
	}
	cout << c << endl;

7. 指针与数组:

c[2]   ===   *(c+2)

c[2][3]  ===  *(*(c+2)+3)

最后,例子只是一种表述,实际编程还得变通。

时间: 2024-07-28 17:31:28

char* 类型使用总结的相关文章

对char类型的理解以及对补码的理解分析

今天遇到这样一个小程序,觉得当中有些问题很容易让人忽略的! 这个程序代码如下: 程序的结果为: 我想很多像我一样的小白可能才开始是想不明白为什么最后的结果是255吧!首先,我们得知道 strlen()是计算字符串长度的函数,但为什么最后得到的字符串长度是255呢?定义的数组a中不是有1000个元素,并且for循环也是执行999次吗? 对于char来说,我们得知道其隐含的结束标记是\0,当编译器识别一个char类型的变量时,读取到\0,则标志着结束:对于这个程序,我们还得注意char的取值围:-1

【转】Hibernate的getSQLQuery方法对char类型的解析问题

[转]Hibernate的getSQLQuery方法对char类型的解析问题 建立数据库: create table T_TEST1( id char (32), name varchar (255), other varchar (255), primary key(id) )insert into T_TEST1 values('2c9090792a18d6ab012a18d77e700001','sfasdf','asdf') insert into T_TEST1 values('2c9

C#基础、基础知识点、char类型的数值转换

char转为int 一个字符 '汉' 怎么可能转换为数字呢? 实际上是可以的,在之前的补充资料中已经说到,计算机对字符的存储,是使用某种编码规则对应的数字来存储的. 在C#语言中,使用Unicode编码来存储字符. 比如汉字 '汉',对应的Unicode编码是27721,在计算机内存中,将使用汗27721对应的二进制来存储. 因此,如果要把 '汉' 转换为int类型的数字,转换的结果就是27721. 那使用什么样的代码来完成该转换呢? char类型的任何数据都可以隐式的转换为int类型. 既然是

SQL里面的char类型

--LEN(参数):获取字符的个数--不区分中英文--DATALENGTH(参数):获取参数所占据的字节数select LEN('中华人民共和国')select LEN('abcd')--select datalength('中华人民共和国')select datalength('abcd')--查询表的数据--char类型:char空间一旦分配,就不会再回收,多余的空间不会回收.但是如果存储的数据的数量大于指定的空间,那么就会报错.当需要存储的值的长度波动变动不大的时候可以使用char.--身

将一个字符串看作一个char类型的数组

有时候我们会遇到将用户输入的一句话中的某一个字符拿出来用的问题. 我们可以将用户输入的字符串看作一个char类型的数组 比如有一个字符串string a = "hello"; 要将'e'输出怎么办? 我们将a看作一个char类型的数组,然后使用for循环来遍历这个数组,然后在控制台中输出即可 for(int i = 0;i<a.Length;i++) { Console.writeLine(a[1]); } 关键是要有将字符串看作char类型数组的思维. 小菜鸟今天的一点小心得,

string 转换char类型

将string转换成char类型 const char *c = string.c_str() char转换string char *c_name = "char" string str_name = c_name

【C语言】【面试题】【笔试题】对于char 类型用%u与%d输出结果解析

#include <stdio.h> int main() { char a = 128;//128=127+1=-1://因为char类型最大能保存的范围为-128~127 //1000 0000 //11111111 11111111 11111111 1000 0000 printf("%u\n", a); system("pause"); return 0; } #include <stdio.h> int main() { char

int类型与char类型的转换

java对char类型的数据在底层是按int类型来处理的 一.int类型与char类型在赋值是可自动转换. 以上可以看出65被自动转换成unicode编所对应的字符,字符B被自动转换成unicode码 二.字符类型的数值可进行数值运算 如上所示,i的结果是66(在代码第5行,i=c+1=65+1=66),c的值为B(代码第8行,c=c+1=65+1=66=B)

MySQL varchar和char类型

varchar和char是两种最主要的字符串类型.不幸的是,很难精确地解释这些值是怎么储存在磁盘和内存中的,因为这根存储引擎的具体实现有关.下面的描述假设使用的存储引擎是InnoDB或者MyISAM.如果使用的不是这两种存储引擎,请参考所使用的存储引擎的文档. 先看看varchar和char值通常在磁盘上怎么存储的.请注意,存储引擎存储char或者varchar值的方式在内存中和磁盘上可能不一样,所以MySQL服务器从存储引擎读出的值可能需要转换成另一种存储格式.下面是关于两种类型的一些比较.

[转载]浅析为什么char类型的范围是 —128~+127

http://blog.csdn.net/daiyutage/article/details/8575248 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来也很简单容易, 以至于不用去思考为什么,不是有一个整型范围的公式吗:  -2^(n-1)~2^(n-1)-1   n为整型的内存占用位数,所以int类型32位 那么就是 -(2^31)~2^31 -1 即    -2