指针是数组的迭代器(指针就是迭代器)
0.字符串数组:
char a[3][25]= {"XUANXIU YUWEN ", “XUANXIU YUWEN”, “FEIXUANXIU TIYU”};就行了 定义成二维数组存储时可以简单看作一排一个字符串数组,
char* a[10] = {“XUANXIU”, “YUWEN”, “XUANXIU”, “SHUXUE”, “FEIXUANXIU”, “TIYU”};这样是定义了一个指针数组 指针元素分别指向每一个对应的字符串存储的首地址
1.C语言指针为什么可以指向字符串常量,却不可以指向整型常量 (https://www.cnblogs.com/Stephen-Qin/p/9643272.html)
char * c=“hello”;//等价于char * c; c=“hello”,这里比较特殊.字符串直接使用代表字符串首地址。
C只可以用指针取字符串常量的地址,该类被认为是左值,而其他的字面值常量(literal constant),则被认为是右值,不允许取地址。
而对于int类型,你可以这样改就能用指针了:
int a=2;
int*p=&a;
2.字符串的引用方式:
用数组名和输出格式%s可以输出整个字符串.比如:
char str[] = “I love China”;
printf(“%s\n”, str);//输出完整字符串
printf(“%s\n”, str + 2);//只输出love China,规定了起点。
类中也有这样的情况
class A
{
public:
A(int i, char *p) :ival(i), ptr§ {};
int ival;
char *ptr;
};
void main()
{
A a(9, “hello”);
cout << a.ival << a.ptr << endl;//这里a.ptr输出hello,即字符指针能直接输出它所指向的字符串。
system(“pause”);
}
3.指针和int常量的用法都也忘光光了
int a = 1;//指针指向变量单元,不能指向int常量,所以要有a来存储.
int *p = &a;//等价于int *p; p = &a;但绝不可以写作:int *p; *p = a;//这样出错,p需要p = &a这样的初始化。
*p = 2;//因为有之前的初始化,才可以这样做.
有一种编译时不报错,运行时报错的写法:
int p = NULL;
p = 2;
这符合c的语法,编译不报错,因为已经对p初始化了.但是空指针表明自己不再指向任何对象,(而非空指针是指向其他变量,比如变量a,对p赋值就是改变a的值)再对p赋值就会出现错误了.如下:
4 字符串指针与字符数组的区别
void main(){
char *s=new char[5];
s=“abcd”;
s[2]=‘y’;
}执行时会有内存读写错误,但是改为:
void main(){
char s[]=“abcd”;
s[2]=‘y’;
}却没有错误,我知道变量一个在堆区,一个在栈区,为什么会出现这个问题
回答
关键是s="abcd"有问题,即使s不是动态指针(比如char * c=“hello”),也会报错。
char *s只是个指针而已,没有分配存储空间的,(指针只是指向某一块内存)
而"abcd"是字符串常量,它是被储存在内存的静态区中的,静态区中的数据是不能被更改的,
char s[]="abcd"等于是你在栈中为s开辟了一个5字节的空间(数组是自己有开辟了内存)
等价于char s[5],所以这个时候你把一个字符s[2]='y’等于是把y放入了栈中
5.关于strcat()(连接函数)的第一个参数, char a[] = “abcd”; char* b = “abcd”; char c[] = “efg”;
strcat(b, c)运行出错,可是为什么strcat(a,c)可以?
最佳答案
其实strcat(b, c),strcat(a,c)都有错
通俗的来讲:
strcat(b, c)运行出错是因为b是一个指向常量字符串的指针,指向的是一片不能运行时改变的内存区域,向内存区域中写入其它的数据,必然会使程序崩溃;而a则是指向一个变量内存区域,是可以动态改变的,a虽然没有足够的空间导致溢出(因为char a[] = “abcd”,数组的长度为5,固定下来了),但c语言不检查数组越界,依然可以写入,但是写入的内纯区域已经不受控制,说不定就覆盖了某些其它变量,是很危险的操作,出错了也很难查找原因。。。
注意char a[] ={‘a’,‘b’,‘c’,‘d’}; 数组a的长度为4,
char a[] = “abcd”,数组a的长度为5,等价于char a[] ={‘a’,‘b’,‘c’,‘d.’\0’'};
6.声明指针变量时系统分配的内存,和指针所指向的内存
这么跟你说,指针本身也是一种变量,就和int型一样,假如你声明int a,其中a是变量名,有自己的一个地址,然后a的值,是另外一个地址,计算机通过变量名就能知道变量值是多少,同样的道理,你声明int p,p是变量名,在计算机中是有独立的内存空间用来存放p的,这样明白吗?只有当你给p赋值的时候,*p才会指向其他的内存空间,存放指针变量本身的内存是一直都在的,也就说声明指针变量时系统分配的内存,和指针所指向的内存,是两个不同的概念