char数组与char指针

1、以字符串形式出现的,编译器会在结尾自动添加\0,思考,为什么?

  存在的C语言方法,如strlen(s),计算字符串的长度,其中s指针。strlen要计算字符串长度,必须知道哪里是结尾,因此使用\0表示结尾。只有字符数组才有\0的概念,其它类型(int)的数组没有这个概念。因为其他类型的数组或者指针,没有strlen这种方法。

  那么问题来了,int数组如何计算长度呢?如int a1 = {3,7,9,};

  使用sizeof(a1)/sizeof(int)。

2、数组可以在栈上分配,也可以在堆上分配,但必须指定大小。

  char a1[100]; //在栈上分配

  char* pa = new char[100];// 在堆上分配,返回首元素的地址

3、char a1[] = "abc"; 相当于在栈顶分配4个字节,分别放上a,b,c,\0,等价于char a1 ={‘a‘,‘b‘,‘c‘,‘\0‘};

4、char* pa = "abc"; 分析一下就知道,pa是char指针,"abc"是一个文本字符串,显然类型不吻合,需要适配。可认为编译器做了下面的事情:在常量区分配4个字节,分别放上a,b,c,\0,然后把a的地址返回给pa。

  注意:文本字符串放在常量区,是不可修改的,试图修改,运行异常。那么在思考一下,既然右边是const,而pa并没有限定为const char*,按道理赋值失败。为什么可以成功?

  可以认为在C语言中,到处充斥着这样的代码。为了兼容,必须允许。但是,我们应该写const char* pa ="abc"; 这样的话,试图修改pa的内容,编译报错。

5、char a1[] = "abc", 等价于char a1[] = {‘a‘,‘b‘,‘c‘,‘\0‘,}; strlen(a1)等于3,长度不包括\0

  假如这样写 char a1[] = {‘a‘,‘b‘,‘c‘,}; strlen(a1)是多少? 答案不确定,因为strlen一直找到\0才认为是结尾。
6、 char a1[] = "abc"; 下面的结果分别是什么?

  cout<<&a1[0]<<endl;

  cout<<a1<<endl;

  输出相同,都是数组元素的第一个地址。

7、char* pa = "abc"; 下面的结果分别是什么?

  cout<<&pa<<endl;

  cout<<&pa[0]<<endl;

  cout<<pa<<endl;

  第一行输出pa在栈上的地址,第二行和第三行输出相同,都是首地址。pa是指针,就是指向首个元素的地址。

8、char a1[5]; 数组名是个指针常量,不能修改指向。

9、char* pa = "abc"; 可认为pa是个指向常量的指针。

10、下面的结果,违反直觉,按道理第4行,第5行应该输出地址。但是却输出指向的字符串。这有一定的合理性,我们打印char指针,往往是要看指向的内容,而不是要看地址是多少。而且cout很容易做到,只要遇到\0就结束。那么问题来了,我想看地址怎么办?使用int强制转化为地址。

1  char a1[]="abc";
2  char* pa="def";
3
4  cout<<a1<<endl; //输出abc
5  cout<<pa<<endl; //输出def
6
7  cout<<(int)a1<<endl; // 输出a1地址
8  cout<<(int)pa<<endl; // 输出pa地址

11、

1  char p[]="abcde";
2  char* p2="abcde";
3
4  cout<<sizeof(p)<<endl; //数组大小为6
5  cout<<sizeof(p2)<<endl; // 指针大小为4
6
7  cout<<strlen(p)<<endl; // 长度为5
8  cout<<strlen(p2)<<endl; // 长度为5

时间: 2024-09-30 12:34:34

char数组与char指针的相关文章

char[]数组与char *指针的区别

char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了.由于string涉及的内容很多,因此本文中就先不整理了,对char[]和 char *进行了一个整理,原理可能还是不太明白,但至少印象深刻了很多. 整型数组和整型指针 在讨论字符数组.字符指针以及字符串之前,先看下整型数组与整型指针的区别 int a[]={1,2,3};//整型数组,a的指向不能

C++ DWORD 转byte char 数组、指针

byte byteData[1024]; // byte数组,示例 DWORD dwData = dwReadBytes; // dword数据,示例 byteData[0] = (dwData & 0xFF000000) >> 24; // 最高位字节 byteData[1] = (dwData & 0x00FF0000) >> 16; // 第二高位字节 byteData[2] = (dwData & 0x0000FF00) >> 8; //

个人理解的int数组和char数组

char数组中不论是一维还是二维的,在程序执行时每一块的分离依据都是以提供的起始地址到'\0'为一个处理的字符串.所以关于char[]的函数都是只提供相应起始地址作为形参就可以. char[]互相交换内容时不是用的=号,而是使用strcpy(a,b),其中a为"被赋值的"char[]的起始地址,b为"要赋的值"的char[]的起始地址.要修改其中的某个字符则可以使用=号 另外例如char* a="abcd"和char b[5]="abc

delphi char数组、string和Pchar的相互转换

因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组.string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原理. 1.string转换成pchar 可以使用pchar进行强制类型转换,也可以使用StrPCopy函数 var s:string; p,p1:PChar; begin s:='Hello Delphi'; p:=PChar(s); ShowMessage(p); p1:=StrAlloc(Len

PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换

PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组之间的转换关系见下图 通过转换链,可以实现任意两个类型之间的互转.如PChar转PAnsiChar,根据转换链可知 Dest := PAnsiChar(AnsiString(Source)),同理PAnsiChar转PChar为 Dest:= PChar(String(Source)) 如果转换结果最终为string,可以无需String转换,如Array[0..n] of AnsiChar转s

char数组构造string

这是一个老掉牙的话题, 但是你稍加不注意就会出错. 最近在写一个可以跨平台打印的程序,就遇到这个问题,故记之.共勉! 用 char 数组初始化string #include <string> using std::string; using std::cout; int main(int argc, const char * argv[]) { char chArray[] = {'m', 'a', 'r', 'k'}; cout << "array size = &qu

char数组与string转换

1.char数组转string 有很多种方法: 假设c字符串定义为char ch[]="hello world!"; 1.向构造函数传入c字符串创建string对象: string str(ch); 2.使用拷贝构造函数创建string对象: string str = ch; 3.对已有的string对象调用string类内部定义的赋值运算符: string str; str = ch; 前两种类似,但和第三种有较大区别,前两种是运用构造函数直接创建一个内容与c字符串一致的string

Delphi中的PChar、String、Char数组

参考:http://blog.csdn.net/procedure1984/article/details/5419616 一.三者的区别 string和char数组都是一块内存,其中存放着连续的字符. string保存具体字符的内存对用户是透明的,有Delphi管理它的分配.复制和释放,用户不能干预(其实也可以,不过是通过非法途径) Char数组类似于C/C++中的字符数组 PChar是一个指针,它的大小只有32位.定义时由Delphi自动填0.要将PChar作为字符串使用的话,必须自己分配内

char数组和string的相互转换

1 //char数组和string的转换 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 int main() 6 { 7 char ch[]="hello world"; 8 // string s=ch;/* string可以直接用char数组赋值*/ 9 string s(ch);/* 对string赋值char数组差不多就这两种*/ 10 cout<<&qu