char*str与char str[]的差异。

char *str 与char str[]的区别与联系 常用以下两种方式定义字符串:一种是字符数组,另一种是指向字符串的指针。 阅读详情

下面是几个错的例子:

1

# include <stdio.h>
int main(void)
{
	char *str;
	scanf("%s",str); //error
	return 0;
}


2

# include <stdio.h>
int main(void)
{
	char *str;
	gets(str); //error
	return 0;
}

3

# include <stdio.h>
# include <stdlib.h>
int main(int argc,char* argv[])
{
	FILE*fp=NULL;
	char*str;
	if((fp=fopen(argv[1],"r"))==NULL)
	{
		printf("file open error!\n");
		exit(1);
	}
	
	fgets(str,4,fp);  //error
	
	fclose(fp);
	fp=NULL;
	puts(str);
	return 0;
}

归纳:

上面的程序都有一个共同点,那就是试图从流中读取一个字符串放到str中。这3个程序都是错误的。

为什么不可以这样?

答:定义的str字符指针,他的值对应的内存空间是不确定的,或者说它的空间是不可用的,就好比int a;

此时的a是一个不可预测的垃圾值一样,把a拿来直接用不能达到我们的目的,那么我们就可以为a赋值,

在来利用a。同样,要想把str变的可用,可以用malloc(或者calloc)为其申请一块一定大小的内存给他,就OK了。

当然,如果你只给str申请了 2个字节的空间,而你却把5个字节大小的字符串放进去,这又是另一种错误,

叫越界。

所以,上面的3个程序,加上:str=(char*)malloc(sizeof(char)*n)


引申:(下面的程序也是同样的错误)


 

# include <stdio.h>
int main(void)
{
	int *p;
        *p=5; //error
	return 0;
}

      

# include <stdio.h>
int main(void)
{
	char *p;
	*p='a';
	return 0;
}

总结:

       定义的指针变量是不能直接拿来存放数据的,它没有有效的空间,使用前应为其动态分配内存等方法,

   让他指向有效内存空间

    

      引用:Stephen Prata 著 《C prime  plus 》P263 

         “  切记:当创建一个指针的时候,系统只分配了用来存储指针本身的内存空间,并不分配存储数据的内存空间

             因此在使用指针变量之前,必须给它赋予一个已分配的内存地址。”


另一个问题:

问:为什么把char*str换成char str[10];这样也可以避免上述的错误呢?

答:此时是把str定义为一个长度为10的数组,那么,str这个数组从一定义就拥有10个字节的内存空间,

他可以指向对应长度的字符数组,无需为其分配空间。


总结:

通过指针去存放数据,要保证这个指针指向有效空间。


另外,char*str=“i am a boy” 与char str[6]="i am a boy"  的区别


1:char*str=“i am a boy”

说明:str在栈里,他是一个指针变量,本身也占用内存,但是他不支配有效内存空间。“i am a boy”是一个常量,

他在静态储存区。

=号的意义是:把“i am a boy”这个数组常量的首地址赋值给str(初始化str),这样str就指向字符数组了。


2:char str[]="i am a boy"  

说明:str[6]="i am a boy" 整个都在栈里,他相当于:str[6]={ ' i ' , ' ' , 'a' , ' m' ,' ', 'a' ,'b' ,'o'  ,'y'}。

str本身支配11个字节的空间。 




最后:再上2个图,说明栈区和常量区的区别









个人心得,有错欢迎提出。

C++ char* str与char str[] 在程序员面试宝典上看到这个两句话: 1、char c[]="hello world"是分配一个局部数组; 2、char *c="hello world"是分配一个全局数组; 最开始还以为是书上说错了,因为自己的理解是这两种方式是等效的。下来查了一下才知道这两种方式的区别。 char* str="hello world ";这个指针指向常量字符串,存储在静态存储区,是只读的,不能被修改。而c 阅读详情

相关推荐

SpotBugs使用

spotbugs命令行参数解析

javajingling的专栏 2951

一图搞懂&str、str、*str的指向关系

当你在函数中运行到这行代码时 unsigned char *str; 系统会在栈中创建一个临时的指针变量str,为其分配一个地址,这个地址就是(&str),指令变量str 指向的地址就是 str , 指向的地址 存储的内容是 *str......

weixin_35637982的博客 4081

Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程

目录1. 前言2. PCM Data Flow3. 总结 1. 前言 本文,我们将以回放(Playback,播放音频)为例,讲解PCM Data是如何从用户空间到内核空间,最后传递到Codec。 在Linux 音频驱动(一) ASoC音频框架简介中,我们给出了回放(Playback)PCM数据流示意图: 对于Linux来说,由于分为 user space 和kernel space,而且两者之间不能随便互相访问。因此用户如果播放音频,则需要调用copy_from_user()将用户数据从user spa

_Modest_的博客 1万+

c语言 char *str 与char str[]区别

c语言 char *str 与char str[] 一、概念不同 C语言中没有特定的字符串类型,常用以下两种方式定义字符串:一种是字符数组,另一种是指向字符串的指针。 char *str 声明的是一个指针,这个指针可以指向任何字符串常量。 char str[] 声明的是一个字符数组,数组的内容可以是任何内容,严格意义上说,末尾加上’\0’ 之后才能算是字符串。 二、变量不同 char *str里的str是指针变量,str的值未初始化(局部变量的话。全局则自动初始化为NULL)。 char str[]里str

weixin_45380951的博客 1万+

Scrapy实现微博关键词爬虫(爬虫结果写入mongodb)

话不多说,上代码: spiders文件夹下的microBlogSpider.py里这样写: # -*- coding: utf-8 -*- import scrapy from scrapy import Spider, Request, FormRequest from scrapy.selector import Selector import datetime import random from blogSpider.items import microBlogItem, keyWordItem f

qq_39360565的博客 1780

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization)

\quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$.

u012133341的博客 339

c语言*str的作用,**c语言str类函数族

//常用到部分功 能: 返回字符串长度用 法: int strlen(char *str);功 能: 返回指向错误信息字符串的指针用 法: char *strerror(int errnum);功 能: 拷贝一个字符串到另一个用 法: char *stpcpy(char *destin, char *source);功 能: 字符串拼接函数用 法: char *strcat(char *desti...

weixin_30069911的博客 1526

在windows系统上使用codex出现应用程序无法正常启动(0xc0000022)的解决方案

本文主要介绍了在windows系统上使用codex出现应用程序无法正常启动(0xc0000022)的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. 原因分析 3. 解决方案

weixin_43178406的博客 10万+

str[]与*str的区别

#include&amp;lt;stdio.h&amp;gt; int main() { char pstr[] = &quot;strins&quot;; *(pstr + 1) = 'a'; printf(&quot;%s\n&quot;, pstr); return 0; } 输出结果是sarins 此种方式,数组的长度由编译器确认, []里面不填数据 “abc”实质是一个常量,初始化时将其赋值(拷贝)给str 除非在初始

huaiyingdetective的博客 7407

C#上位机+YOLO工业视觉全实战:从ONNX部署到产线缺陷检测落地(2026年工业级实战指南)

在2026年,工业视觉落地的核心挑战不是“能不能做”,而是“能不能在产线实时跑起来C#为何成为最优解?

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 733

【AI智能体】Claude Code +Superpowers 项目实战操作详解

Claude Code +Superpowers 项目实战操作详解

congge 4055

char *str 和 char str[] 的区别

相同点: 都是定义一个字符串 不同点: 1.含义上的区别 char str[] 是定义一个字符串数组,数组对应的是一块内存区域,而char *str 是定义一个指向字符串的指针,即指向一块内存区域。 数组的内存大小和其地址在作用域里是固定不变的,只有它存储的内容可以改变;而指针却不同,它指向的内存区域的大小随时可以改变,而且当指针指向常量字符串时,它指向的内容是不可以被修改的,否则在运行时会报错。...

qq_43579888的博客 1万+

SAP-MM:SAP MM(物料管理)模块 的系统化学习计划

SAP MM模块的系统化学习计划

baidu_35680696的博客 1551

关于单片机中使用char str[]与const char *str的用法区别

关于单片机中使用char str[]与const char *str的用法区别 char strA[]="test_1" char *strB="test_1" const char *strC="test_1" 有的朋友在写程序的是一直分不清这几个的区别,博主开始在使用这几个有点心得体会 我先给我的结论是 char strA[]="test_1" (正确) 放在ram区 char *strB="test_1" (错误,操作写的属性是未定义行为,会出现问题...

m0_57504634的博客 934

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【c语言】char str[]与char *str的区别

今天做题的时候遇到一个问题,如何实现一个函数返回一个指针,返回一个整型值很简单,因为“C语言是按值传递的”,而想要返回一个指针,比如char型的指针,然后想在主调函数中使用被调函数的返回指针,分析了一下关于char str[]和char *str的区别 下面介绍一下char str[]="hello"与char *str="hello"的区别 char str[]=“hello”; 第一个表达式表示的是在动态变量区中开辟一个能连续放6个字符的数组,数组名称是str.而赋值运算符右边是一个字符串常量,这个字符

q1449660223的博客 896

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

char* ptr与char str[]的比较

(1) char* ptr="Hello World!";(新标准c++中这样写会有警告:ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] ) (2) char str[]="Hello World!";"Hello World!"本身都在存储在常量储存区。但是 char *str = "Hello ...

qq_38323666的博客 1551

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

char str[ ]和char* str

1.对比两种写法 2.char * char* str = “hello”;表示将字符串常量"hello"的首地址赋给指针str,所以str指向常量也就是const类型的值,只读而不可写。 3.char [] char str[] = “hello”;表示开辟一片内存空间,首地址为str,并将字符串常量"hello"的每一个字符赋值到数组的对应位置,这样定义的字符串str是可写的。 4.结论 第一种写法错误,第二种正确!!!! ...

azrealq的博客 2731

char str[]与char *str的区别

                                 &...

weixin_44208324的博客 297

char* str和char str[]的区别

char* str和char str[]的区别   转载▼ 本文转自:http://blog.youkuaiyun.com/andysun1986/article/details/6941230 我记得很久以前我也遇到过这个问题,后来也是如下解决的,只是不记得写个日志,今天转发了一个博客作为笔记! 要求用递归实现字符串反转的问题:输入char* str="abcdef",

foreverhuylee的专栏 1267

char* str = "Hello" 与 char str[] = "hello"在函数中的区别

转载自 http://blog.youkuaiyun.com/wangluotong00/article/details/39367709 今天做题的时候遇到一个问题,如何实现一个函数返回一个指针,返回一个整型值很简单,因为“C语言是按值传递的”,而想要返回一个指针,比如char型的指针,然后想在主调函数中使用被调函数的返回指针,分析了一下关于char str[]和char *str的区别 下面介绍一下cha...

qq_25713443的博客 9420

指针和数组名的区别 char *str 和 char str[]的不同之处

一个简单的字符串相关程序,运行时崩溃,罪魁祸首 char *str  和 char str[]的不同之处 代码如下: view plaincopy to clipboardprint? #include       using namespace std;      void deletechar(char *str, ch

herostarone的专栏 1184

char * str 与 char str[] 的区别:存储方式的不同决定使用的不同

本文名字是自己重新取的,是根据学习之后的感受重新命名,下面是我学习时看的文章,希望有所帮助。 char*str与char str[]的差异。 char *str1 和 char str2[]的详解 ...

chillinght的博客 214

C++ char与string之间的转换

1、将string转换为char * 或者char[] 1)调用string的data函数 stringstr="abc"; char*p=str.data(); 2)调用string的c_str函数 stringstr="gdfd"; char*p=str.c_str(); 3)调用string的copy函数...

u013925378的博客 1万+

关于利用栈检查表达式中的括号是否配对

使用 char *str 更加通用,因为它可以接受任何形式的字符串指针,无论是静态分配的字符串还是动态分配的字符串。当你在函数参数中看到 char *str 或者 char str[],它们实际上是等价的,都表示一个指向字符数组的指针。但是,在不同的上下文中使用它们可能会有不同的意图或习惯。总之,处理一个特定大小的数组,那么使用 char str[SIZE](其中 SIZE 是数组的实际大小)可能是更好的选择。但是在大多数情况下,尤其是当你处理的是不确定长度的字符串时,更推荐char *str。

m0_63887447的博客 257

c++ string 和 char * 之间互相转换

char * 可以转string,直接赋值即可。不能单独赋int和c字符类型值。string s1("demo1");string s1 = "demo";char *p = "demo";s1 = p;string转char*有三种方式:c_str(),data(),copy()c_str()返回一个c风格的字符数组,带有'\0'结束data()返回一个数组,不自动增加‘\0’copy(...

测试 9221

C中char [] 和char *的区别

直接的区别: 1. char[] 定义的是一个字符数组, (数组) 2. char* 定义的是一个字符串的指针, (指针) 具体区别: 数组 , 每一个元素都是字符, 修改一个数组指修改数组的值,即改变其中一个或多个的值 ; 指针, 其值就是一个地址,修改指针也只是把指针指向别的地址或者置为NULL。 关于字符串长度的比较: 1. char str1[] = "abcde"; 2. char* str2 = "abcde"; str1是定义在data段...

Michael 1474
上一篇: 堆和栈的区别
下一篇: 一个图说明文件,数据流,缓冲区的关系。
love1code
博客等级 码龄12年 19粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值