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 找到才停止。

入门后指针进阶习题深度分析相关推荐

  1. C语言从指针入门到指针进阶

    目录 一.​​​​​​​了解指针 二.二级指针 三.字符指针 四.野指针 1.未初始化 2.指针越界访问 3.动态内存释放 4.规避野指针 五.指针数组 六.数组指针 七.函数指针 八.函数指针数组 ...

  2. 留言获赠书 | 朱春雷:Rust编程:入门 实战与进阶

    祝微信公众号 乐生活与爱IT 的读者朋友们,五一劳动节,吃好喝好睡好玩好,节日快乐! 今天给读者朋友们一个福利,请您在文章后面留言,留言比较精彩的,且获赞数比较多的朋友(至少3位),将有机会获得一本, ...

  3. 第十七章 指针进阶(1)

    C语言学习之路 第一章 初识C语言 第二章 变量 第三章 常量 第四章 字符串与转义字符 第五章 数组 第六章 操作符 第七章 指针 第八章 结构体 第九章 控制语句之条件语句 第十章 控制语句之循环 ...

  4. 深度分析Java的枚举类型——枚举的线程安全性及序列化问题

    点击关注,快速进阶高级架构师 作者:Hollis 写在前面:Java SE5提供了一种新的类型-Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为 ...

  5. Memcached深度分析【zz】

    Memcached深度分析 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东西,相信 ...

  6. 查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...

    " 本文作者张彦飞,原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.即时通讯网收录时有少许改动.本文已同步发布于52im社区:http:// ...

  7. NLP入门之综述阅读-基于深度学习的自然语言处理研究综述

    NLP入门-综述阅读-[基于深度学习的自然语言处理研究综述] 基于深度学习的自然语言处理研究综述 摘要 0 引言 1 深度学习概述 卷积神经网络 递归神经网络 2 NLP应用研究进展 3 预训练语言模 ...

  8. Mac 终端的入门指南与进阶技巧

    前言 hihi,勇敢的小伙伴儿们大家好啊,今天我想分享的是 Mac 终端的一些用法,说起分享的原因呢,也是在生活中受到了前辈的指导,那分享的目的呢,就是想在分享的同时和大家一起学习并逐渐掌握这个技能, ...

  9. 【鸿蒙OS开发入门】06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 启动init进程

    [鸿蒙OS开发入门]06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 一.head.S 启动start_kernel() 1.1 start_kernel() ...

最新文章

  1. php自动计算增长率,如何写sql计算增长率?
  2. 单链表——判断一个单链表中是否有环
  3. c语言bim的题目,求助:几道简单C语言程序小题
  4. mysql5.5多实例配置_mysql-5.5.32多实例配置
  5. HTML中的列表和表格
  6. (5) DSP28335--SCI
  7. centOS安装java
  8. (HDU4324)判断一个图中是否存在两点的出度相同
  9. 2059. 转化数字的最小运算数
  10. kafka自定义序列化器
  11. 5G 时代,将边缘计算进行到底!
  12. PHP 实现Session入库/存入redis
  13. IntelliJ IDEA功能和惊喜赠品
  14. nbu备份脚本 linux,NBU60网络备份大全之Linux设备管理(参考Word)
  15. 引用 CSS+DIV/Ul+LI/dl+dt+dd/tabale+css 样式
  16. 【论文解读】深度残差网络去雨模型cvpr_Removing rain from single images via a deep detail network
  17. 6.0 Python 模块编写 导入 引用
  18. 名人名言页面的效果图HTML,名人名言书签制作方法图片
  19. HDU-5773 The All-purpose Zero(LIS变形)
  20. Linux系统清空回收站

热门文章

  1. 为何华为的5G专利高居第一名,却还被高通要求缴纳专利费?
  2. jdk1.8版本下访问本地数据库文件(access数据库.mdb)与(火鸟数据库.fdb)踩坑记录
  3. 物联网云平台概念及系统架构
  4. 使用CSS连接数据库
  5. ASR长语音识别,基于vue2
  6. Ubuntu10.10 32位系统下moses统计机器翻译系统使用命令记录
  7. jadx-gui 1.4.5使用时遇到的问题
  8. JS-Web-API
  9. ArcEngine根据属性分割要素类的实现方法
  10. 高承实:做链改项目,想不清楚一定不会成功