C语言(较深入原理):%s通过字符串首元素地址输出,用指针数组来作示例
首先,我们输出一个字符串都知道是用%s来输出,但是我们并没有多想是通过什么方式来输出的。
今天我在看指针数组的时候发现了一个问题,按就是定义一个字符类型的指针数组,
/*字符串的输出本身就需要他的地址,字符串没有单独的类型变量表示,只能用char类型数组来表示,指针数组所有空间存放的都是指针,所以在放字符串的时候,你这个字符串已经是一个地址了*/
我用一个通俗易懂的例子来说明一下:(你必须要知道的就是字符串的输出是要第一个字符的首地址)
刚刚说到每一个指针数组的空间都是用来存放地址的,所以不管你放什么进去这个数组都会默认你存了一个地址进去。
当你存放一个字符串进去的时候,也就是指针数组把你这个字符串的地址放进去了,存进去了,这时候第i个元素是字符串的地址,用的时候直接p1[i]就可以了
现在你再看代码,对于在指针数组里面的字符串为什么在输出的时候不用*p1[i]而是用p1[i], 因为你, 因为在指针数组中p1[i]中第i个元素就是字符串的地址,那么为什么用*(p1+i)也可以呢,因为你这个数组是指针,使用指针的时候既可以*(p1+i),也可以p1[i], 这应该是学习到指针都应该知道的事情。
#include<stdio.h>
int main()
{
char *p1[5] = {
"s你是大帅比",
"s嗨害!",
"s鸡汤别来",
"keep going",
"s栓Q了"
};
int i;
for(i = 0; i < 5; i++)
{
printf("%s\n", *(p1 + i));//*(p1 + i) 和 p1[i]一样,因为输出字符串时用字符串中第一个字符的地址来输出的
}
return 0;
}
/*用指针数组输出数字的时候就是要用*p1[i] , 因为每一个空间对应的是变量的地址 ,输出数字不能用地址,而是要用地址去寻找这变量对应的值*/
如:
#include<stdio.h>
int main()
{
int a = 1, b = 2, c = 3, d = 4, e = 5;
int *p2[5] = {&a,&b,&c,&d,&e};
int i;
for(i = 0; i < 5; i++)
{
printf("%d\n", **(p2 + i));//**(p2 + i) 与 *p2[i]一样
}
return 0;
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
总结:对比下来,简而言之就是看你输出的需求,字符串输出就是要地址,数值要的是变量。地址是不需要继续取地址符,而你输出数值的时候,但是你放进去的是地址,输出是数值,自然不能直接用地址,要用地址所指向的那个变量空间。
C语言(较深入原理):%s通过字符串首元素地址输出,用指针数组来作示例的更多相关文章
- 【嵌入式开发】C语言 指针数组 多维数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...
- 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- C语言 指针数组 多维数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...
- C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- C++语言中数组指针和指针数组彻底分析
################################# ## 基本知识 ## ...
- C语言学习笔记--数组指针和指针数组
C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...
- C语言--- 高级指针2(结构体指针,数组作为函数参数)
一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针 结构体: typedef struct stu{ char name[ ...
- C语言-数组指针与指针数组
1.思考 下面这些声明合法吗? int array[5]; int matrix[3][3]; int * pa = array; int * pm = matrix; 问题: array代表数组首元 ...
- GO语言的进阶之路-Golang字符串处理以及文件操作
GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...
- Atitit.加密算法 des aes 各个语言不同的原理与解决方案java php c#
Atitit.加密算法 des aes 各个语言不同的原理与解决方案java php c# 1. 加密算法的参数::算法/模式/填充 1 2. 标准加密api使用流程1 2.1. Md5——16bi ...
随机推荐
- #矩阵乘法,线段树#CF575A Fibonotci
题目 分析 \(K\)那么大肯定是矩阵乘法, 带修改可以用线段树单点修改, 转移矩阵类似于斐波那契数列, 这题思维难度不大,细节很多,需要很长时间QWQ 时间复杂度\(O(mlog_2K)\),具体注 ...
- Java HashMap 和 HashSet 的高效使用技巧
Java HashMap HashMap 是一种哈希表,它存储键值对.键用于查找值,就像数组中的索引一样.HashMap 的优势在于它可以使用任何类型作为键,并且查找速度很快. 创建 HashMap ...
- C# 使用GridControl显示数据库表格 使用VS2017连接Mysql并显示数据库表格
教程引用:https://www.bilibili.com/video/BV1pT4y1u7d2?from=search&seid=10645874367755405718
- Qt实现多图片合成PDF文件
需求:纯Qt,把多张图片合成到一个PDF文件中 // 合成PDF // include <QPdfWriter> QString pdfFileName = "D:\\a.pdf ...
- 实时 3D 深度多摄像头跟踪 Real-time 3D Deep Multi-Camera Tracking
实时 3D 深度多摄像头跟踪 Real-time 3D Deep Multi-Camera Tracking 论文url https://arxiv.org/abs/2003.11753 论文简述: ...
- IIS applicationHost.config 查找历史
背景 iis 有时候需要修改配置,一般来说,我们会去修改applicationHost.config配置,当然,很多时候我们都需要去备份一个配置文件,但是可能忘记了,那么是否有补救的方式? 补救方式 ...
- Python阿里云消息推送调用API
很多公司测试APP推送时候,应该也是很头疼:推送环境:测试.正式,稍不注意就把测试的push到正式上,导致所有用户都收到 例子很多: 其实阿里.极光都有推送Api,直接调用API就ok,特别是有的公司 ...
- Go 单元测试之mock接口测试
目录 一.gomock 工具介绍 二.安装 三.使用 3.1 指定三个参数 3.2 使用命令为接口生成 mock 实现 3.3 使用make 命令封装处理mock 四.接口单元测试步骤 三.小黄书Se ...
- vue中 如何实现一个单文件组件
前端开发人员只要了解过vue.js框架可能都知道单文件组件.vue.js中的单文件组件允许在一个文件中定义一个组件的所有内容.这是一个非常有用的解决方案,在浏览器网页中已经开始提倡这种机制.但是不幸的 ...
- 一些奇奇怪怪的js知识
0.关于前端为什么typeof null 得到的结果是 object 对于 null 来说,很多人会认为他是个对象类型,其实这是错误的. 虽然 `typeof null` 会输出 `object`,但 ...