真是惭愧,都要上大四了才来补这个知识点。之前只学了c的时候字符数组就是一塌糊涂,还没搞懂的时候学了C++,后来基本都是用的string,没有用过char*,今天又碰到了这个问题,一定要把他弄懂!!!
事情的起因是我给一个char* str赋了初值,后来又尝试改变它,但程序一直崩溃找不到原因,最难受的是编译不会报错,但运行就会崩溃。后来查资料发现char*指向常量的时候,常量是不能够被修改的,这估计也是他们两个最大的区别了
总结如下:
数组表示一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变,赋值是在运行时进行的
指针指向一块内存区域,而指针却不同,它指向的内存区域的大小可以随时改变,赋值是在编译时进行的,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
//编译不会保存,但运行会崩溃,因为试图修改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
数组存储在栈区,系统会自动为其分配内存
指针存储在堆区,需程序员自己进行释放。如果只有定义,没有用char* sp=a;指向某个具体数组,则使用之前必须用malloc为他手动分配内存,使用完后用free释放
char *sp=(char*)malloc(sizeof(char)*(n));这里可以看看堆栈的区别:https://blog.csdn.net/qq_32783703/article/details/87707766
用运算符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