真是惭愧,都要上大四了才来补这个知识点。之前只学了c的时候字符数组就是一塌糊涂,还没搞懂的时候学了C++,后来基本都是用的string,没有用过char*,今天又碰到了这个问题,一定要把他弄懂!!!
事情的起因是我给一个char* str赋了初值,后来又尝试改变它,但程序一直崩溃找不到原因,最难受的是编译不会报错,但运行就会崩溃。后来查资料发现char*指向常量的时候,常量是不能够被修改的,这估计也是他们两个最大的区别了
总结如下:
1.含义上的区别
数组表示一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变,赋值是在运行时进行的
指针指向一块内存区域,而指针却不同,它指向的内存区域的大小可以随时改变,赋值是在编译时进行的,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
//编译不会保存,但运行会崩溃,因为试图修改s1的内容,但是指针s1指向的是常量,不能修改
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void) {
char*s1="123456789";
char*s2="123456";
strncpy(s1,s2,6);
printf("%s %s\n",s1,s2);
return 0;
}
//可正常被修改
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void) {
char s1[10]="123456789";
char s2[10]="123456";
strncpy(s1,s2,6);
printf("%s %s\n",s1,s2);
return 0;
}
//运行结果为 123456789 123456
2.使用
数组存储在栈区,系统会自动为其分配内存
指针存储在堆区,需程序员自己进行释放。如果只有定义,没有用char* sp=a;指向某个具体数组,则使用之前必须用malloc为他手动分配内存,使用完后用free释放
char *sp=(char*)malloc(sizeof(char)*(n));
这里可以看看堆栈的区别:https://blog.csdn.net/qq_32783703/article/details/87707766
3.sizeof的区别·
用运算符sizeof可以计算出数组的容量(字节数),而用sizeof却无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是4或者2(即指针变量所占内存单元的字节数,一般情况下指针变量占2个或4个字节的内存单元)。在进行参数传递时,数组会自动退化为同类型的指针。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void function(int a[]) {
printf("%d\n",sizeof(a));
}
int main(void) {
int a[10]= {1,2,3,4,5,6,7};
int*p=a;
printf("%d %d\n",sizeof(a),sizeof(p));
function(a);
return 0;
}
输出:
40 8
8