1、通常字符数组中所存储的内容可以称为字符串,字符串的表示方法有两种:
char *p1 ="a string ";和 char p2[] = "another string";
p1指向的这字符串是个常量,不可用改变,程序编译期间就为“a string”这个字符串分配了固定的空间,它被存储在全局静态区。而p2是个变量,其内容可以被更新和改变,p2可以理解为一个不可以改变其指向位置的指针即char *const p2,它所占用的内存在程序运行时被自动的分配和释放,而p1占用内存要到整个程序结束时才被释放。
2、指针和数组的区别
数组是开辟一块连续的内存空间,数组本身的标识符(也就是通常所说的数组名)代表整个数组,可以使用sizeof来获得数组所占据内存空间的大小(注意,不是数组元素的个数,而是数组占据内存空间的大小,这是以字节为单位的)。举例如下:
#include <stdio.h>
int main(void)
{
char a[] = "hello";
int b[] = {1, 2, 3, 4, 5};
printf("a: %d\n", sizeof(a));
printf("b memory size: %d bytes\n", sizeof(b));
printf("b elements: %d\n", sizeof(b)/sizeof(int));
return 0;
}
数组a为字符型,后面的字符串实际上占据6个字节空间(注意最后有一个\0标识字符串的结束)。从后面sizeof(b)就可以看出如何获得数组占据的内存空间,如何获得数组的元素数目。至于int数据类型分配内存空间的多少,则是编译器相关的。gcc默认为int类型分配4个字节的内存空间。
3、char* 和char[]实例
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int *ip = new int;
char s[] = "abcd";
char *p = "abcd";
cout<<"ip = "<<ip<<endl;
cout<<"*ip = "<<*ip<<endl;
cout<<"&ip = "<<&ip<<endl;
cout<<"s = "<<s<<endl;
cout<<"*s = "<<*s<<endl;
cout<<"(s+1) = "<<(s+1)<<endl;
cout<<"*(s+1) = "<<*(s+1)<<endl;
cout<<"&s[1] = "<<&s[1]<<endl;
cout<<"p = "<<p<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"&p = "<<&p<<endl;
cout<<"(p+1) = "<<(p+1)<<endl;
cout<<"*(p+1) = "<<*(p+1)<<endl;
cout<<"&p[1] = "<<&p[1]<<endl;
char *c1 = "abcd";
char c2[] = "abcd";
char *c3 = (char *)malloc(sizeof(char));
c3 = "abcd";
printf("%d %d %s\n",&c1,c1,c1);
printf("%d %d %s\n",&c2,c2,c2);
printf("%d %d %s\n",&c3,c3,c3);
return 0;
}