c语言中 char怎样用,C语言中char*和char[]用法区别分析

本文详细分析了C语言中char*和char[]的区别。char*定义的是一个指向字符的指针,不知道内存大小,不能直接修改其指向的内容。而char[]定义的是字符数组,可以直接修改数组元素。通过示例代码展示了如何使用这两种类型,并指出在特定情况下,如使用malloc分配内存后,char*也可进行下标操作。文章还提及了C++中的string类型与char*的区别以及转换方法。

C语言中char*和char[]用法区别分析

本文实例分析了C语言中char* 和 char []的区别。分享给大家供大家参考之用。具体分析如下:

一般来说,很多人会觉得这两个定义效果一样,其实差别很大。以下是个人的一些看法,有不正确的地方望指正。

本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以:

当char *s = "hello";后,不能使用s[0]='a';语句进行赋值。这是将提示内存不能为"written"。

当用char s[]="hello";后,完全可以使用s[0]='a';进行赋值,这是常规的数组操作。

若定义:

char s[] = "hello";

char *p = s;

也可以使用p[0] = 'a';因为这是p ==s,都是指向数组的指针。

下面看另外一种定义:

char *s = (char *)malloc(n(www.jb51.net));//其中n为要开辟空间的大小

这句话其实相当于:

char s[n];

定义的也是一个指向数组的指针,便可进行数组的下标操作

例子

#include

int main(int argc, char* argv[]) {

char* buf1 = "this is a test";

char buf2[] = "this is a test";

printf("size of buf1: %d\n", sizeof(buf1));

printf("size of buf2: %d\n", sizeof(buf2));

return 0;

}

结果是:

$ > ./main

size of buf1: 4

size of buf2: 15

相信本文所述对大家C语言程序设计的学习有一定的借鉴价值。

时间: 2014-09-14

前言 大家在学习或者使用Windows编程中,经常会碰到字符串之间的转换,char*转LPCWSTR也是其中一个比较常见的转换.下面就列出几种比较常用的转换方法.大家可以根据自己的需求选择相对应的方法,下面来一起学习学习吧. 1.通过MultiByteToWideChar函数转换 MultiByteToWideChar函数是将多字节转换为宽字节的一个API函数,它的原型如下: int MultiByteToWideChar( UINT CodePage, // code page DWORD d

看这样一段简单的程序: #include char* fun() { return "fun"; } int main() { printf("%s", fun()); return 0; } 这段程序可以正常run,但是最好不要这么做. 因为  直观上你返回了一个局部的东西出去.  你可以再外面定义这个常量,然后返回. 另外,字符串常量不可修改,而char*意味着要修改,故此最好加上const. 以上就是小编为大家带来的浅谈char

1.首先必须了解,string可以被看成是以字符为元素的一种容器.字符构成序列(字符串).有时候在字符序列中进行遍历,标准的string类提供了STL容器接口.具有一些成员函数比如begin().end(),迭代器可以根据他们进行定位. 注意,与char*不同的是,string不一定以NULL('\0')结束.string长度可以根据length()得到,string可以根据下标访问.所以,不能将string直接赋值给char*. 2.string 转换成 char * 如果要将string直接

复制代码 代码如下: //string --> const char string str2ch: str2ch.c_str(); //============================= //string --> char * //先转为 const char , 然后 转char * char TargetFile[strlen(TorrentFileNameDown.c_str())];    strcpy(TargetFile,TorrentFileNameDown.c_str(

C语言中判断一个char*是不是utf8编码 里我修改了一下, 纯ASCII编码的字符串也返回true, 因为UTF8和ASCII兼容 实例代码: int utf8_check(const char* str, size_t length) { size_t i; int nBytes; unsigned char chr; i = 0; nBytes = 0; while (i < length) { chr = *(str + i); if (nBytes == 0) { //计算字节数 i

复制代码 代码如下: #ifndef USE_H_      #define USE_H_ #include       #include       #include       using namespace std;      class CUser      {      public:          CUser();          virtual~ CUser();          char*

protobuf的Demo程序是 C++版本的protubuf有几种serialize和unSerialize的方法: 方法一: 官方demo程序采用的是 复制代码 代码如下: // Write the new address book back to disk. fstream output(argv[1], ios::out | ios::trunc | ios::binary); if (!address_book.SerializeToOstream(&output)) { cerr &l

string,CString,char*之间的转化 int 转 CString:CString.Format("%d",int);...............................string 转 CString CString.format("%s", string.c_str()); 用c_str()确实比data()要好. .......................................char* 转 CString CString.

首先解释下三者的含义 CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作(适用于MFC框架),使得MFC在做字符串操作的时候方便了很多.需要包含头文件#include C++是字符串,功能比较强大.要想使用标准C++中string类,必须要包含#include // 注意是,不是,带.h的是C语言中的头文件.Char * 专门用于指以'\0'为结束的字符串. 以下

161edb68bf06234b4e358c0c8fb7bfa2.png

在做在线编程题目的时候,需要了解一下数据的输入格式.这样可以对数据处理有比较好的把握,不需要把太多的时间放在这个上面,注重主要的算法逻辑即可.这里总结一下,为之后笔试做个准备. 1.从终端输入的方式 Scanner类的使用方法: Scanner scanner = new Scanner(System.in); 从终端获取输入流,输入流传入Scanner初始化对象时,作为参数传递进去. Scanner类的重要几个方法: next方法(读取一个字符) 1.一定要读取到有效字符后才可以结束输入(要是

1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = sdf.format(calendar.getTime()); 2.String 转化Calendar String str="2012-5-27"; SimpleDateFormat s

我们可以认为格林威治时间就是时间协调时间(GMT=UTC) GMT : 格林威治时间 UTC : 时间协调时间 1.time_t time_t time(time_t *t); 取得从1970年1月1日至今的秒数. time_t类型,这本质上是一个长整数( long ),表示从1970-01-01 00:00:00到目前计时时间的秒数,timeval则精确到毫秒 2.timeval timeval类型,这是一个结构体类型,struct timeval 头文件为 time.h struct tim

34a616310542dc15985818af484f5789.png

innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间.什么是共享表空间和独占表空间共享表空间以及独占表空间都是针对数据的存储方式而言的.共享表空间:  某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下. 默认的文件名为:ibdata1  初始化为10M.独占表空间:  每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm

1.字符串---------->jQuery对象 $(HTML字符串): $('

我是祖国的一朵小花
') 待添加列表 2.jQuery对象---------->DOM对象 下标选取法(原理:jQuery是DOM的数组形式):$("h2")[1] 使用.get(index)函数 3.字符串----------->DOM对象 写一个脚本函数 function parseDom(nodelist) { //nodelist是htm

有一点可以不用否认的,那就是当每个页面中中都需要调用同一个文件时,采用JS的文件会比HTML文件快,为了方便这2种代码之间的转化,网上有很多网站提供这样的服务,为了不用转化一下就网上转化,于是呼我找了个最简单的代码,可以轻松时间这2种代码之间的转变,演示地址为:http://www.bkye.com/tool/html-js.htm,如果您在看到演示后觉得还8错的说,可以看看下面的代码: HTML与JS互转工具 function change(){ txt.value="document.wri

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值