黑马程序员 C语言的字符数组和字符指针

【黑马程序员】---C语言经典编程实例分析 C语言经典编程实例 题目01:提示用户输入一个正整数n,利用while循环计算并输出:1-2+3-4+5-6+7…+n的和. int main() { // 1.定义变量存储用户输入的整数 int n = 0; // 2.判断n是否为正整数 while (n <= 0) { // 2.1 提示输入 printf( 阅读详情

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、

<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------------------

C语言的字符数组和字符指针
这些天在做一些c语言的题目中我发现自己压根不了解指针啊,什么时候用指针,什么时候用数组完全没有概念,这应该是看那个运气好就可能被我用上了,也许以前我的运气爆棚,在使用的时候没有发现两者有什么不一样。其实很多时候它们时可以互换的,但在这些天我好像对他有点新的认识。
事情的开始时这样的,我想要实现这样一个功能,就是把一长字符串(只包含由字符和空格)利用空格分割成单词,并把这些单词保存在字符串数组中,最初时,脑子里有了一个大概的构思就开始着手实现了,构思大概是这样的:遍历整个长字符串从中找到空格符后把前面的单词记录放入字符串数组中,当遇到\0结束遍历。就这样我开始实现,就这样我的麻烦来了(其实是没有什么编程经验了)。对于单词数组我很自然地想到了字符串数组,
char *words[100];定义了一个可以放100个单词的字符串数组,并且利用指针的形式还不需要担心单词长度(我还为自己的‘天才’想法沾沾自喜)。但后来在找到单词时我把单词给单词数组时:words[j][count] = string[i];问题出现了,这样子是不行的,因为words没有初始化,所以没有分配内存地址,上面赋值的过程就会出现内存错误(这个是过了很久才发现的,所以说智商是我的硬伤),最后没有办法只能用二维字符数组了words[100][20]一个单词最长为20可放100个单词的数组,问题虽然是可以勉强解决,但是这样的函数的适应性不强,单词长度超过20或单词个数超过100时就不好用了。后来仔细琢磨了下好像真的不能用指针,由于初始化或者赋一个字符数组变量(单词),前者我几乎找不到,对于后者我想到了用中间的一个字符串来作为当前单词然后放入字符串数组中,发现还是不行,最后得到只是最后一个单词。最终还是用二维数组吧。(有不同的idea请给我留言啊,教教我)

// 已知字符串

    char *string = "wo shi zhong guo ren a a I am chinses";

    // 存放单词的数组

    char *words[100];

    // i是string的下标,count记录但当前单词的长度,n是在单词数组中的已经存放了的单词

    int i = 0,count = 0, n = 0;

    while(1)

    {

// 遇到字符串结束符\0,完成遍历,之前并检查最后一个单词是否使最长的单词

        if(string[i]=='\0')

{

   ... ...

            break;

        }

        // 遇到空格时,查看空格前的这个单词是否是最长单词

        if(string[i]==' ')

        {

             ... ...

            for (int j=0; j<count; j++)

            {

                words[n][j] = string[i-count+j];   //这里会出现Thread 1:EXC_BAD_ACCESS(code=1,address=0x0)内存错误

            }

            // 每个单词过后,单词计数器的清零,并结束本次循环

            count = 0;

            i++;

            continue;

        }        // 不是空格就将单词长度+1,并进入下次循环

        count++;

        i++;

    }

最后没有办法我只能该char *words[100]; 该成:char words[100][20]; 数组里面是保存了单词,但是我怎么就是不开心呢??有那位如果看了请给在下解惑啊~
还有一个问题是关于需要返回一个数组的这样的问题,刚开始不懂,就把返回类型写成指针的形式,但想想不对,尼玛好别扭:int *xxx(),后来一想,为什么不用数组做参数呢,这样也不是可以达到指针的效果(反应真是迟钝啊)。结果有了下面的东东。

// 进制转换,必须由要转换的数x,要转化的进制r和转化后的进制数组scale

void scaleSystem(int x,int r,int scale[SCALE]) 

总结这次接触指针的过程,刚开始还自信满满,以为自己学的还不错,没有想想在实用是怎么都不会啊,看样子学以致用真的不是一句空话啊。对于这次指针总结是:没有初始化的指针不能用,利用指针定义的字符串是不可以通过数组的形式修改的,也就是说它具有只读的属性。这样是可以的:

    char *string = "beautiful";

    printf("%c",string[0]);

    // string[0] = 'q';  // 这样会出现内存错误

原因是:

C语言中,凡是以""括住的形式直接出现,而且你又没有为其分配内存空间的字符串都是常量字符串,是不能修改其值的。
char a[6]="hello";
a[2]='c';
就可以了。这里你为hello分配了一个长度为6的字符数组空间来存放。

对于返回数据是数据时,可考虑通过参数的形式来实现当中值更换。


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、

<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------


黑马程序员-C语言数组与指针学习心得 ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、数组的赋值,以下几种都是正确的: 1、int ages[5]={1,2,3,4,5}; 2、int ages[5]={1,2};    //开辟的数组内存还是20个字节 3、int ages[5]={[3]=3,[4]};//只给在下标3和4的数组赋初值 4、int ages[]= 阅读详情

相关推荐

三菱CNC数据采集实战:从环境搭建到代码实现的完整指南

本文提供了一份完整的三菱CNC数据采集实战指南,涵盖从开发环境搭建、核心SDK获取、网络配置到基于C#和A2协议的完整代码实现。文章详细解析了初始化、连接管理、数据获取与展示四大核心模块,并分享了错误处理、性能优化及与MES系统集成的关键技巧,帮助工程师快速构建稳定可靠的工业数据采集系统。

wood5的博客 889

黑马程序员--c语言:字符串、指针

一、字符串 1.基本应用 char name[] = {'i', 't', 'c', 'H', 's', 't', '\0'}; char name[] = "itcast"; char name[8] = "it"; char name2[8] = {'i', 't', '\0'}; char name2[8] = {'i', 't', 0}; char name2[8] = {'

gululu23的专栏 399

Ubuntu 20.04 系统备份和还原

最近大家Ubuntu开发环境,经常出现搭着搭着系统就挂了,于是开始琢磨了Ubuntu系统的备份和还原,以备不时之需,Linux环境搭建实在是有点太细,好多情况下,就算曾经搭建过一遍,再次搭建有些包还是忘了安装,做好备份是十分必要的。 经过了一番研究,Ubuntu备份有很多方式:根目录tar、dd、Systemback(1.0版本已经不维护了,2.0版本收费)等等,最终决定使用 —— Timesift, 因为方便一些。 文章参考:小马虎的救星——Timeshift Timeshift Timeshift,是L

Z_Paper的博客 2万+

黑马程序员C语言基础(第六天)指针

https://www.bilibili.com/video/BV1jW411K7v2/?p=70&spm_id_from=pageDriver 文章目录指针概述内存物理存储器和存储地址空间内存地址指针和指针变量指针基础知识指针变量的定义和使用通过指针间接修改变量的值指针大小野指针和空指针(wild pointer & null pointer)万能指针void *const修饰的指针变量指针和数组数组名指针法操作数组元素指针加减运算1)加法运算2)减法运算指针数组多级指针指针和函数函数形参

Dontla的博客 2419

告别云端依赖:手把手教你在Windows 10/11上离线部署WhisperDesktop(含模型下载避坑指南)

本文详细介绍了如何在Windows 10/11上离线部署WhisperDesktop,包括硬件要求、模型下载、环境配置和实战应用。通过本地部署,用户可以实现高效的语音转文字功能,无需依赖云端服务,特别适合注重数据隐私和需要离线工作的场景。

weixin_33736048的博客 322

利用Python爬虫获取淘宝商品评论:实战案例分析

在数字化时代,数据的价值日益凸显,尤其是对于电商平台而言,商品评论作为用户反馈的重要载体,蕴含着丰富的信息。本文将详细介绍如何利用Python爬虫技术获取淘宝商品评论,包括代码示例和关键步骤解析。

2401_87849335的博客 2833

黑马程序员——C语言之字符串指针

-------android培训、java培训、iOS培训、.Net培训、期待与您交流! ---------- 在C语言中,可以通过字符数组存放一个字符串,也可以用字符指针指向一个字符串。 【示例】用字符数组存放一个字符串,然后输出该字符串。 #include int main(){ char string[] = "I love China!"; print

lucky2468的博客 495

电磁场仿真软件:Sonnet_(12).Sonnet与其他软件的集成

Sonnet作为电磁场仿真领域的强大工具,不仅能够独立完成复杂的仿真任务,还可以通过与其他软件的集成,实现更高效的工作流程和更广泛的功能扩展。通过与CAD、EDA、数据处理软件、MATLAB、Python以及云计算平台的集成,Sonnet用户可以更好地利用现有设计资源,进行参数优化和结果分析,从而提升设计和仿真效率。希望本节的内容能够帮助你更好地理解和应用Sonnet的集成功能。

kkchenjj的博客 1432

黑马程序员————C语言指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1,指针简介     指针是C语言中非常重要的一种数据类型。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。 2,指针定义     对指针变量的定义包括三个内容: (1)指针类型说明,即定义变量为一个指针变量; (2)指针变量名;

bluedevils99的专栏 788

【VisDrone数据集】YOLOX训练VisDrone数据集步骤与结果

YOLOX训练VisDrone数据集步骤与结果。

Gorgeous_wxd 2233

网络发生环路了,别慌,这些步骤一定要安排起来!

网络环路是指在计算机网络中,数据包因为某种原因在多个网络设备之间不断循环,形成了一个闭环。这样数据包就永远也无法到达目标,导致网络的流量滞留,设备间的资源耗尽,最终网络性能受到严重影响。网络环路虽然是常见的网络故障,但只要掌握正确的排查和解决方法,面对环路问题时,你就能冷静应对,迅速恢复网络的正常运行。希望这篇文章能帮助你更好地理解和处理网络环路的问题,让你的网络环境更加稳定可靠!🚀📡如果你有任何疑问,或者在实际操作中遇到困难,随时可以联系我,我们一起攻克技术难题!

网络技术联盟站 1966

黑马程序员——C语言基础---指针3

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------                     第一讲    字符串指针介绍及使用  1、字符串指针  在C语言中,可以用两种方法访问一个字符串   1)字符数组  char string[]=”I love China!”; printf("%s\n",string); 说明:和前面介

lhp_heima的博客 814

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

黑马程序员——C语言基础07—指针

一、指针 1.变量单元的地址称为“指针”,通过指针能找到以他为地址的内存单元。 int main() { int *p; //“*”的第一种含义: 定义 int a = 20; p = &a; // 此时我们称指针变量p指向了变量a *p = 10; //“*”的第二种含义: 访问 a = 20; printf("%d

Peide04271915的博客 548

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[黑马程序员]C语言指针深入理解

0x00 数组指针一个变量有地址,一个数组包含若干个元素,每个数组元素都有相应的地址(数组元素的指针地址是连续的)。比如:int arr[10]数组名不代表整个数组的地址,数组名代表首元素的地址,arr == &arr[0]答案是ture。 在使用指针指向数组元素时,允许进行加法(加常量)、减法(减常量)、自增、自减运算。int arr[5] = {1, 10, 20, -10, 5}; int

海军的专栏 403

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

黑马程序员——C语言——数组和指针

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——— 一、数组 1、 数组的定义 类型 数组名[元素个数]; 数组元素是有序的,每个元素都有一个唯一的下标,下标从0开始。 2、 数组的初始化 int count = 5; int ages[count]; ages[0]

qq_24074659的专栏 562

关于c语言指针的理解

指针的定义:指针是内存中一个最小单元的编号,也就是地址。平时口语中说的指针,通常指的是指针变量,即一个变量专门用来存放另一个变量的地址。根据指针的定义我们可以知道指针即使内存中一个最小单元的编号,也就是地址。这是指针的表示方法在C语言中,指针通过特定的符号“*”来表示。例如,“int *ptr;”表示ptr是一个指向int型变量的指针。通过一段代码演示(只附带代码主体部分)

yexhenai的博客 1090

黑马程序员——c语言的复杂数据类型:指针和结构体

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流——- 一、指针介绍指针的重要性指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言 以后在OC中是要经常的用到指针,有些难度比较大的指针只需要理解就可以了二、指针变量的定义 1.定义格式:变量类型 *

pangetzp_41904129的专栏 1014

黑马程序员-06.C字符串和指针

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

qiu_csdn的专栏 380

黑马程序员——C语言基础---又见指针

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-第一讲 数组名和数组指针变量作函数参数数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址, 形参得到该地址后也指向同一数组。 这就好象同一件物品有两个彼此不同的名称一样。同样,指针变量的值也是地址, 数组指针变量的值即为数组的首地址,当然也可作为函数的参数使用。float aver(float *

qq_27239329的博客 463

【黑马程序员】【C语言】指针

一、指针变量的定义 1. 格式:变量类型 *指针变量名;  2. 举例:int *p;   char *p2;   3. 注意:定义变量时的*仅仅是指针变量的象征 二、利用指针变量简单修改其他变量的值 1.指向某个变量   int a; int *p;   p = &a;   或者   int *p = &a; 2.修改所指向变量的值   *p = 10

MarsII的iOS技术博客 409

【黑马程序员】C语言学习笔记之指针(十一)

--------------------------------------------IOS期待与您交流!-------------------------------------------- 一、什么是指针? 指针是用来存放变量地址的。通过指针可以间接操纵变量。 二、指针的定义 变量类型 *变量名; 如:int *p;定义了一个int类型的指针p。 注意:任何类型的指针都占据8个

kqygww的专栏 1162

黑马程序员——3、C语言(数组和指针)

---------------------- Java培训、Android培训、iOS培训、.Net培训,期待与您交流! ---------------------

tan_qi的专栏 749

黑马程序员——C语言学习总结11-21

一、for语句 二、while语句

zhangjiawei2014的专栏 1126

黑马程序员——零基础学习iOS开发——06 字符串、指针、指针和数组、指针和字符串、指针和函数

一、字符串 1.什么是字符串  简单的字符串 ”itcast” 2.字符串的初始化 //都是字符串 char name[8]= "it"; char name2[8]={'i', 't', '\0'}; char name3[8]={'i', 't', 0}; // \0的ASC码值是0 char name4[8]={'i', 't'

demon_csd的专栏 609

黑马程序员---c语言 指针

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

Q472622179的专栏 693
上一篇: 黑马程序员 关于一个ARC引发的问题
下一篇: 黑马程序员 scanf死循环了呢
MeditatingPig
博客等级 码龄12年 3粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值