入门后指针进阶习题深度分析
1.sizeof() 整形数组
#include<stdio.h>
int main()
{//整形数组int a[] = { 1,2,3,4 }; //注意:数组名在 1.sizeof(数组名) 2.&数组名 这两种情况时表示整个数组printf("%d\n", sizeof(a)); //sizeof(数组名) 这里为整个数组 一共4个元素 每个类型为int 4*4=16printf("%d\n", sizeof(a+0));//不是特殊情况 表示首元素地址 是地址(指针) 就是4/8printf("%d\n", sizeof(*a));//对首元素地址解引用得到的还是首元素 一个int大小 4printf("%d\n", sizeof(a+1));//首地址+1 变成第二个元素的地址 指针是存放地址的 所以是地址大小就为 4/8 printf("%d\n", sizeof(a[1]));//a[1]实际上是 *(a+1) 对第二个地址解引用 得到第二个元素为 int 4printf("%d\n", sizeof(&a));//&a 表示拿到整个数组的地址 但实际还是个(地址)指针 大小为4/8(x64)printf("%d\n", sizeof(*&a));//&a 拿到整个数组的地址 再解引用得到整个数组 为 4*int 16printf("%d\n", sizeof(&a+1));//先&a得到整个元素的地址 再+1 跳过一个数组的大小 得到其地址 4/8printf("%d\n", sizeof(&a[0]));//&a[0]等价于 &*(a+0) 实际上第一个元素的地址 4/8printf("%d\n", sizeof(&a[0]+1));//同理 先得到第一个元素的地止再+1 为第二个元素地址 4/8return 0;
}
2.sizeof() 字符数组
#include<stdio.h>
int main()
{//字符数组char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr)); //整个数组 6*char 6printf("%d\n", sizeof(arr+0));//首元素地址 4/8printf("%d\n", sizeof(*arr)); //首元素 1printf("%d\n", sizeof(arr[1]));// *(arr+1) 1printf("%d\n", sizeof(&arr)); //整个数组地址 4/8printf("%d\n", sizeof(&arr+1)); //跳过整个元素指向后面的地址 4/8printf("%d\n", sizeof(&arr[0]+1));//跳过首元素 第二个元素地址 4/8return 0;
}
3.streng() 字符数组
#include<stdio.h>
#include<string.h>
int main()
{//字符数组char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", strlen(arr)); //首元素地址给出 往后找\0 可是没有 随机值printf("%d\n", strlen(arr+0));//同上 随机值//printf("%d\n", strlen(*arr)); //解引用 首地址拿到 a的阿斯克码值 97 strlen当做地址访问 err//printf("%d\n", strlen(arr[1]));// *(arr+1) 拿到b的阿斯克码值98 当地址访问 errprintf("%d\n", strlen(&arr)); //整个数组地址 传到strlen中强转成char* 随机值printf("%d\n", strlen(&arr+1)); //跳过整个元素指向后面的地址 随机值-6printf("%d\n", strlen(&arr[0]+1));//跳过首元素 第二个元素的地址 随机值-1return 0;
}
4.sizeof() 字符串
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "abcdef"; //arr里放的其实是 a b c d e f \0printf("%d\n", sizeof(arr)); //整个数组 7*char 7printf("%d\n", sizeof(arr+0));//首元素地址 4/8printf("%d\n", sizeof(*arr)); //解引用 首地址 1printf("%d\n", sizeof(arr[1]));// *(arr+1) 第二个元素 1printf("%d\n", sizeof(&arr)); //4/8printf("%d\n", sizeof(&arr+1)); //跳过整个数组指向后面的地址 4/8printf("%d\n", sizeof(&arr[0]+1));//跳过首元素 第二个元素的地址 4/8return 0;
}
5.strlen() 字符串
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "abcdef"; //arr里放的其实是 a b c d e f \0printf("%d\n", strlen(arr)); //首元素地址 6printf("%d\n", strlen(arr+0));//首元素地址 6//printf("%d\n", strlen(*arr)); //解引用 首地址 a-97 err //printf("%d\n", strlen(arr[1]));// *(arr+1) 第二个元素 b-98 errprintf("%d\n", strlen(&arr)); //整个数组地址 相对于strlen相当于首元素地址 6printf("%d\n", strlen(&arr+1)); //跳过整个数组指向后面的地址 后面无\0 随机值printf("%d\n", strlen(&arr[0]+1));//跳过首元素 第二个元素的地址 5return 0;
}
6.sizeof() *p 字符串
#include<stdio.h>
#include<string.h>
int main()
{char *p = "abcdef"; // p 存放的是a的地址printf("%d\n", sizeof(p)); //首元素地址 4/8printf("%d\n", sizeof(p+1));//首元素地址+1 第二个元素b地址 4/8printf("%d\n", sizeof(*p)); //解引用 首地址 得到第一个元素 1 printf("%d\n", sizeof(p[0]));// *(arr+0) 首元素 1printf("%d\n", sizeof(&p)); //指针变量p的地址(二级指针) 4/8printf("%d\n", sizeof(&p+1)); //指针变量p地址之后的地址 4/8printf("%d\n", sizeof(&p[0]+1));// &*(p+0)+1 跳过首元素地址 第二个元素的地址 4/8return 0;
}
6.strlen() *p 字符串
int main()
{char *p = "abcdef"; // p 存放的是a的地址printf("%d\n", strlen(p)); //首元素地址 6printf("%d\n", strlen(p+1));//首元素地址+1 第二个元素b地址 5//printf("%d\n", strlen(*p)); //解引用 首地址 得到第一个元素 err //printf("%d\n", strlen(p[0]));// *(arr+0) 首元素 errprintf("%d\n", strlen(&p)); //指针变量p的地址(二级指针) \0 未知 随机值 printf("%d\n", strlen(&p+1)); //指针变量p地址之后的地址 随机值printf("%d\n", strlen(&p[0]+1));// &*(p+0)+1 跳过首元素地址 第二个元素的地址 5return 0;
}
7.二维数组
int main()
{int a[3][4] = { 0 }; //二维数组可以看成 3个一维数组 每个数组4个元素printf("%d\n", sizeof(a)); //sizeof(数组名)为整个数组 12*4=48printf("%d\n", sizeof(a[0][0]));//首元素 4printf("%d\n", sizeof(a[0])); //二维数组可以看做一维数组 a[0]可看做第一行数组名 单独放在sizeof内 计算第一行元素大小 16printf("%d\n", sizeof(a[0]+1)); //数组名不是单独放的 第一行首元素地址+1 为第二个元素地址 4/8printf("%d\n", sizeof(*(a[0]+1)));//第一行第二个元素地址 解引用 4printf("%d\n", sizeof(a+1)); //不是单独放 a为第一行的地址 +1 第二行的地址 4/8printf("%d\n", sizeof(*(a+1))); //对第二行的地址解引用 16printf("%d\n", sizeof(&a[0]+1)); //&数组名 为整个第一行数组地址 +1 第二行数组地址 4/8printf("%d\n", sizeof(*(&a[0]+1)));//第二行元素 16printf("%d\n", sizeof(*a)); //a不是单独放 为第一行地址 解引用 16printf("%d\n", sizeof(a[3])); // sizeof根据类型算出 不会真正去访问 第四行和前几行一样 int [4] 16return 0;
}
总结:
数组名通常情况下是首地址。 二维数组的首地址是第一行的地址。
但有两个例外。1.sizeof(数组名) 2.&数组名 是表示整个数组的。
sizeof是操作符 用来计算其所占内存空间的大小 不会真实访问内存 只要知道类型就可以。
strlen是函数 用来计算字符串长度的函数 只能针对字符串 他会从你给的地址向后访问找\0 找到才停止。
入门后指针进阶习题深度分析相关推荐
- C语言从指针入门到指针进阶
目录 一.了解指针 二.二级指针 三.字符指针 四.野指针 1.未初始化 2.指针越界访问 3.动态内存释放 4.规避野指针 五.指针数组 六.数组指针 七.函数指针 八.函数指针数组 ...
- 留言获赠书 | 朱春雷:Rust编程:入门 实战与进阶
祝微信公众号 乐生活与爱IT 的读者朋友们,五一劳动节,吃好喝好睡好玩好,节日快乐! 今天给读者朋友们一个福利,请您在文章后面留言,留言比较精彩的,且获赞数比较多的朋友(至少3位),将有机会获得一本, ...
- 第十七章 指针进阶(1)
C语言学习之路 第一章 初识C语言 第二章 变量 第三章 常量 第四章 字符串与转义字符 第五章 数组 第六章 操作符 第七章 指针 第八章 结构体 第九章 控制语句之条件语句 第十章 控制语句之循环 ...
- 深度分析Java的枚举类型——枚举的线程安全性及序列化问题
点击关注,快速进阶高级架构师 作者:Hollis 写在前面:Java SE5提供了一种新的类型-Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为 ...
- Memcached深度分析【zz】
Memcached深度分析 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东西,相信 ...
- 查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...
" 本文作者张彦飞,原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.即时通讯网收录时有少许改动.本文已同步发布于52im社区:http:// ...
- NLP入门之综述阅读-基于深度学习的自然语言处理研究综述
NLP入门-综述阅读-[基于深度学习的自然语言处理研究综述] 基于深度学习的自然语言处理研究综述 摘要 0 引言 1 深度学习概述 卷积神经网络 递归神经网络 2 NLP应用研究进展 3 预训练语言模 ...
- Mac 终端的入门指南与进阶技巧
前言 hihi,勇敢的小伙伴儿们大家好啊,今天我想分享的是 Mac 终端的一些用法,说起分享的原因呢,也是在生活中受到了前辈的指导,那分享的目的呢,就是想在分享的同时和大家一起学习并逐渐掌握这个技能, ...
- 【鸿蒙OS开发入门】06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 启动init进程
[鸿蒙OS开发入门]06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 一.head.S 启动start_kernel() 1.1 start_kernel() ...
最新文章
- 0基础学习数据分析必须掌握的技能有哪些?
- js基础面试高频面点1:变量提升
- 【存储过程】从数据库中读取数据保存到文件中
- Computing--图灵机
- vivo分屏_如果你用的是vivo手机,这4个功能别忽略,不然几千块就白花了
- k8s通过label来控制pod的位置
- Xshell替代品 -- FinalShell
- numpy基础知识点
- 谷歌和GitHub 联手提出新方法,提振软件供应链安全
- express学习 - (3)express 路由
- python分布式开发容易吗_Python能实现分布式的进程吗?
- 自制导纳信号发生器 [原创cnblogs.com/helesheng]
- 匹配滤波器结合Matlab实现
- CS61c Fall 2019 project1
- 计算机学院运动会加油,学校运会加油稿
- 嗅觉AI:为减少食物浪费出点力
- oracle证书怎么查成绩,Oracle认证考试成绩查询
- [DAX] FORMAT函数
- 水管工游戏(随机地图版)
- 级联引用完整性约束ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }