char* str和char str[]的区别

真是惭愧,都要上大四了才来补这个知识点。之前只学了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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值