深入理解字符串指针和字符串数组

C语言拯救者(指针进阶--10) 两万字讲解指针!本期干货满满,本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 阅读详情

首先我们来看一段程序:

#include <stdio.h>

int main()
{
        char str[] = "hello code";
        char *ps = "hello code";
        char *p = str;

    
        printf("str: %s\n",str);
        printf("&str: %s\n",&str);
        printf("&&str: %s\n",&p);
        printf("&&str: %p\n",&p);
        printf("---------------------------------\n");
        printf("ps: %s\n",ps);
        printf("&ps(s): %s\n",&ps);
        printf("&ps(p): %p\n",&ps);

        return 0;
}

它的输出结果如图:

分析:我们首先声明了一个字符串数组和一个字符串指针。然后将他们等同类型的输出做对比。

    从输出结果我们可以看到,想要输出整个字符串。分别以%s格式输出str和ps即可。


1.字符串指针名ps和数组名str都存放着字符串的首地址。而字符串本身存放在以该首地址为首的一块连续的内存空间中,并以 '\0' 作为串的结束。

2.对str和ps分别取地址,以%s格式输出。

     &str:  输出的结果仍然是字符串。

     &ps:  输出的结果为乱码。

那么,这是什么原因呢?

    实际上,对于字符串数组,str和&str都一样,都是字符串数组str[]的首地址。但类型不一样,一个是指向char的指针,一个是指向整个数组的指针。但是对他们分别+1效果就不一样了,一个偏移sizeof(char),一个偏移sizeof(char)*11(也就是整个数组的大小)。所以字符串数组可以理解为存在“双层地址”,但是这两个地址值都是一样的,都指向字符串首地址。

    而对于字符串指针,ps和&ps相去甚远了。ps是整个字符串的首地址,由于并不存在类似数组的"双层地址“结构,所以ps已经是指向字符串最底层最基本的地址了,不具有数组名这一地址,只具有“单层地址”,所以对它进行&操作,然后以%s格式输出,这是不合法的,将一个地址以%s输出只能得到乱码。

3.如上图:对于字符串数组,我们加入了一个指针变量p,使它指向str,然后进行&p(相当于&&str)操作,以%s格式输出,结果才出现乱码。而对于字符串指针,只以%s格式输出&ps操作结果就显示乱码。我们将&&str和&ps分别以%p格式打印出来,输出结果显示为正常地址。证实了我们的“双层地址”和“单层地址”一说。







变量与指针、数组与指针习题详解 变量与指针1.有如下语句int a=10,b=20,*p1=&amp;a,*p2=&amp;b;如果让两个指针变量均指向b,正确的赋值方式是  B    。A)*p1=*p2;    B)p1=p2;    C)p1=*p2;    D)*p1=p2;2.执行以下程序后,a的值为 0  ,b的值为 7  。int main(){int a,b,k=4,m=6,*p1=&amp;k,*p2=&amp... 阅读详情

相关推荐

深入理解C语言中的数组、指针和字符串

本篇博客深入探讨了C语言中的数组和指针的关系,展示了如何通过指针在函数间传递数组以及如何修改数组元素。同时,对字符串的使用和特性进行了详细说明,包括字符串与字符数组的区别、字符串的结束标志以及如何通过函数处理字符串。...

weixin_32747681的博客 301

作业记录2从键盘输入一个字符串并保存在字符数组str1中,将字符数组str1中下标为偶数的字符保 存在字符数组str2中并输出。例如,当str1=“cdefghij“,则str2=“cegi“。

从键盘输入一个字符串并保存在字符数组str1中,将字符数组str1中下标为偶数的字符保存在字符数组str2中并输出。例如,当str1=“cdefghij”,则str2=“cegi”。 有两种方法: 方法一: 下面展示一些 内联代码片。 //方法一 #include <stdio.h> void main() { char a[20],b[20]; int i,j=0; gets(a); for(i=0;a[i]!='\0';i++) { if(i%2==0) { b[j]

m0_54152502的博客 5216

逆向工程师的Shopee爬虫避坑指南:af-ac-enc-dat参数生成原理与反反爬策略

本文深入剖析了Shopee电商平台的反爬虫加密机制,重点解析了核心请求头参数x-sap-ri、x-sap-sec及af-ac-enc-dat的生成原理与联动关系。文章从逆向工程视角,提供了定位加密代码、分析算法逻辑的实战方法,并分享了基于JS执行环境模拟与无头浏览器控制的可持续反反爬策略,为高效、稳定地采集数据提供专业指南。

weixin_28607671的博客 1494

Linux:字符串数组和字符串指针的定义赋值操作

【代码】Linux:字符串数组和字符串指针的定义赋值操作。

katerdaisy的博客 736

若依框架-实现管理端与用户端的不同页面布局

我们现在要做的是:管理员登录时展示后台管理端,普通用户登录时展示我们自己写的页面。所以我们可以用v-if来判断登录用户的角色,如果用户角色包含admin,说明是管理员,渲染管理端相关组件,否则渲染用户端组件。不过若依作者的本意还是想退出系统后清空角色信息,所以为了保险期间,我们可以在退出系统后,延迟2秒,再单独清空角色信息。当我们登录管理端后,再退出登录,会有那么一瞬间渲染用户页面,然后才是回到登录界面。这个时候,前端检测到角色信息为空,不包含admin,于是就会渲染用户页面。用来延迟 2 秒执行。

m0_74462339的博客 1566

RPA实战-UiPath自动化处理Outlook邮件附件全流程解析

本文详细解析了如何使用UiPath实现Outlook邮件附件的自动化处理全流程,涵盖环境配置、核心流程实现、高级功能扩展及性能优化技巧。通过RPA技术,企业可大幅提升邮件附件处理效率,减少人工操作错误,适用于财务、物流等多个场景。

weixin_33701251的博客 427

Linux C语言:指针与数组

x[i] 、*(px+i)、*(x+i) 和px[i]具有完全相同的功能:访问数组第i+1个数组元素。

Liu1013216383的博客 607

不用买显示器!用USBMMID虚拟显示器软件在Win10上扩展4个屏幕(保姆级教程)

本文提供了一份详细的保姆级教程,指导用户如何在Windows 10系统上,无需购买额外硬件,通过USBMMID虚拟显示器软件扩展出多达4个虚拟屏幕。文章深入解析了虚拟显示器的核心原理,并基于微软IDD框架,手把手教学从软件获取、环境检查到安装配置的全过程,帮助开发者和多任务用户构建高效、免费的虚拟多屏工作站,实现生产力的飞跃。

backprop5master的博客 660

数组灵活多变的访问形式

下面是一个举个栗子 #include <stdio.h> int main() { char str[20] = "www.szbaoan.com"; char *s1 = str; char *s2 = str+2; char c1 = str[4]; char c2 = *str; char c3 = *(str+4); ...

嵘屹 994

保姆级教程:在Windows/Linux双系统下搞定Microsemi Libero SoC v11.8安装与白银版License激活

本文提供了一份详细的Microsemi Libero SoC v11.8在Windows/Linux双系统下的安装与白银版License激活指南。涵盖环境准备、安装流程、License跨平台配置及常见问题排查,帮助开发者高效搭建FPGA开发环境。

weixin_30603633的博客 420

互联网人提高效率必备软件合集

很多的时候我们解决不了问题,只是因为没有找到对的工具,实际上,很多好的工具就在那里,只是你不用而已。这点上,信息壁垒是一个很大的原因,因此我希望兄伙伴们多出去走走,不要只是局限在一个圈层;

zhonglunshun的专栏 3484

*(p+i) ,C语言数组指针_C语言中文网

一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。 字节是内存中的最小可操作单位,我们通常将一个字节称为一个内存单元。 一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量)组成的。每个数组元素按其类型不同占有几个连续的

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 8557

C 语言多文件编程 : 大型程序的组织与管理

本文介绍了C语言多文件编程的核心概念与实践方法。主要内容包括:1. 多文件编程的必要性:解决单文件编程在大型项目中的维护和协作问题;2. 文件组织方式:头文件(.h)负责声明接口,源文件(.c)实现具体功能;3. 编译链接过程:分阶段编译和链接多个源文件;4. 头文件设计原则:包含接口声明、使用保护机制、保持自包含性;5. 模块化实践:通过示例展示学生信息管理系统的模块划分;6. 构建工具:介绍Makefile的编写和使用方法。文章还提供了创建静态库和动态库的指导,并强调了模块化设计、信息隐藏等软件工程原则

2503_91057718的博客 1947

30深入理解C指针之---字符串和数组

  一、字符串与数组    1、定义:使用字符数组表示字符串    2、特征:      1)、可以直接使用字符串字面量初始化字符数组      2)、声明后,赋值就只能使用字符串操作函数strcpy函数赋值      3)、可以使用数组的一一赋值      4)、可以使用数组的整体赋值      5)、无需而外申请内存空间    3、应用: 1 #include <stdio.h&...

weixin_30535167的博客 72

DeepSeek+即梦:AI视频创作从0到1全突破

本文为 DeepSeek 与即梦生成视频全攻略,从前期注册登录、熟悉工具界面及硬件网络准备入手,助读者开启 AI 视频创作。详细阐述利用 DeepSeek 构思脚本、即梦实现画面生成与静态图转动态视频的方法,包括提示词编写、参数调整等技巧。同时介绍后期合成音画、添加字幕特效及多平台适配要点,结合实战案例解析全流程。还分享进阶提示词优化、版权注意等避坑指南,为创作者提供从 0 到 1 的 AI 视频创作完整解决方案。

邓邓子的博客 8111

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【深入理解C指针】经典笔试题——指针和数组

一些指针和数组笔试题的解析,强化对C语言指针的理解!

qq_63320529的博客 1275

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

五、指针和字符串--普通仙女为指针怒码万字

前篇: 一二---普通仙女对指针的学习记录(从入门到学废) 三---普通仙女对指针的学习记录(从入门到学废) 四、数组指针与指针数组--普通仙女为指针怒码万字 目录 1.字符串常量/字符串字面量 2.字符数组 3.用指针表示法创建字符串 4.字符串数组 5.字符串指针做函数参数 1.字符串常量/字符串字面量 用双引号括起来的内容称为字符串字面量,也叫字符串常量,存储时,字符和编译器加的\0都被存在内存里。 字符串常量属于静态存储类别,存储一次,可以使用多次。双引号括起来的内容 就相当

weixin_59901957的博客 747

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

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

【C语言系列】深入理解指针(5)

本文深入探讨了C语言中关于sizeofstrlen、数组和指针的一些基础概念,并通过代码示例进行了详细的讲解。本篇文章深入分析了sizeofstrlen、数组与指针等概念,并通过一系列代码示例加深了对这些概念的理解。对于初学者来说,掌握这些基础知识是学习C语言的关键。文章不仅揭示了这些基本概念的使用方法,还通过具体例子帮助理解如何避免常见的错误,如越界访问和指针运算中的误解。

2301_80179750的博客 1万+

指针详解(1) -字符串指针、指针数组与数组指针

文章目录前言一、字符串指针二、指针数组1.2.读入数据总结 前言 在初级阶段的《指针》章节,我们知道了指针基本概念: 指针是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。 指针的运算。 接下来,我们继续探讨指针的高级使用 一、字符串指针 (1)例1 int main() { char* p = "hello world"; //*p = 'w';//这种写法

weixin_52142420的博客 602

数组,字符串,指针

---------- IOS培训、java培训----------   数组 一、 数组的基本概念 一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢? 1. 什么是数组 数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的 2. 数组的特点  只能存放一种类型的数据,比如int类型的数组、float类型的数组  里面存放的数据称为“元素”

juanjuan2018的专栏 831

C语言:数组转换指针的时机

1)用 a[i] 这样的形式对数组进行访问总是会被编译器改写成(或者说解释为)像 *(a+i) 这样的指针形式。2)指针始终是指针,它绝不可以改写成数组。你可以用下标形式访问指针,一般都是指针作为函数参数时,而且你知道实际传递给函数的是一个数组。3)在特定的环境中,也就是数组作为函数形参,也只有这种情况,一个数组可以看做是一个指针。作为函数形参的数组始终会被编译器修改成指向数组第一个元素的指针。4)当希望向函数传递数组时,可以把函数参数定义为数组形式(可以指定长度也可以不指定长度),也可以定义为指针。

Dola的博客 1486

深入理解指针(5)

3. 指针运算笔试题解析在之前的中我们学习了回调函数相关知识,并且学会了如何使用库函数qsort,以及模拟实现了qsort,接下来在本篇中将对srtlen和sizeof进行细致的讲解,并对相关的题型进行讲解,一起加油吧!!!

mljy.博客 1985

掌握C语言指针,轻松解锁代码高效性与灵活性(中)

本博客将深入探讨C语言中的复杂指针概念,包括二级指针、指针数组和数组指针。我们将详细解释这些概念的含义、用法和实际应用场景,帮助读者全面理解指针在不同情境下的灵活运用。通过本文,读者将掌握处理多维数据和动态内存分配的关键技能,提升对C语言指针操作的深入理解,从而为更高级的编程挑战做好准备。

Bettysweetyaaa的博客 1万+

常量字符串指针

常量字符串指针 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdio.h> int main() { const char* a[] = { "work","at","alibaba" }; const char** pa = a; pa++; printf("%s\n", *pa); ...

qq_43808700的博客 568

C语言如何⽤指针表示字符串?

如何⽤指针表示字符串呢?

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 904

C++第八周mooc在线测评—第8周 按址操作(2)——指针与数组、字符串、结构体,动态数组

//利用指针输出数组中的元素(20分) //题目内容: //编写程序,把从1到n的n个整数赋予某个int型数组,然后用int型指针输出该数组元素的值。, // //输入格式: //输入参数n // //输出格式: //输出是1到n n个数组元素, 注意最后一个元素之后没有空格。 // //输入样例: //9 // //输出样例: //1 2 3 4 5 6 7 8 9 #include int

qq_28833741的博客 3585
上一篇: 自主编写程序实现strcmp函数功能
下一篇: C++实现单向链表
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值