char *和char []区别

本文探讨了字符数组与指针在C/C++中的不同应用方式及其特性,包括字符串的两种表示方法、指针与数组的主要区别,并通过具体示例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值