IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> sizeof与strlen区别详解—数组、指针、地址实例 -> 正文阅读

[数据结构与算法]sizeof与strlen区别详解—数组、指针、地址实例

数组名是首元素的地址 唯独这两种情况

1、sizeof(数组名) 此时表示整个数组的长度
2、&数组名 此时表示整个数组的地址

整形数组

#include <stdio.h>
int main()
{
	int arr[]={1,2,3,4};
	printf("%d\n",sizeof(arr));       //16
	printf("%d\n",sizeof(arr+0));     //4/8
	printf("%d\n",sizeof(*arr));      //4 首元素的地址解引用就是首元素
	printf("%d\n",sizeof(arr+1));     //4/8
	printf("%d\n",sizeof(arr[1]));    //4
	printf("%d\n",sizeof(&arr));      //4/8 &arr 取出的是整个数组的地址,但是整个数组的地址也是地址,地址的大小就是 4/8 字节
	printf("%d\n",sizeof(*&arr));     //16 &arr 是数组的地址 数组的地址解引用访问的数组 sizeof计算的就是数组的大小 *与&抵消后 就变成了 数组的大小
	printf("%d\n",sizeof(&arr+1));    //4/8
	printf("%d\n",sizeof(&arr[0]));   //4/8
	printf("%d\n",sizeof(&arr[0]+1)); //4/8
	return 0;
}

字符数组

#include <stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));       //6
	printf("%d\n", sizeof(arr+0));     //4/8 arr是首元素的地址 arr+0 还是地址
	printf("%d\n", sizeof(*arr));      //1 首元素
	printf("%d\n", sizeof(arr[1]));    //1
	printf("%d\n", sizeof(&arr));      //4/8 数组的地址还是地址
	printf("%d\n", sizeof(&arr+1));    //4/8
	printf("%d\n", sizeof(&arr[0]+1)); //4/8

	printf("%d\n", strlen(arr));       //随机值 遇到0结束
	printf("%d\n", strlen(arr+0));     //随机值
	printf("%d\n", strlen(*arr));      //err strlen 需要的是一个地址 *arr相当于数组名解引用 数组名就是首元素 首元素地址解引用就是首元素 ‘a’的 ASCII为 97 它就会把97当成地址 就变成了非法访问
	printf("%d\n", strlen(arr[1]));    //err
	printf("%d\n", strlen(&arr));      //随机值
	printf("%d\n", strlen(&arr+1));    //随机值-6
	printf("%d\n", strlen(&arr[0]+1)); //随机值-1
	return 0;
}
#include <stdio.h>
int main()
{
	char arr[] = "abcdef"; //arr 实际的内容为 a b c d e f \0
	printf("%d\n", sizeof(arr));       //7
	printf("%d\n", sizeof(arr+0));     //4/8 首元素的地址+0 还是地址
	printf("%d\n", sizeof(*arr));      //1
	printf("%d\n", sizeof(arr[1]));    //1
	printf("%d\n", sizeof(&arr));      //4/8
	printf("%d\n", sizeof(&arr+1));    //4/8
	printf("%d\n", sizeof(&arr[0]+1)); //4/8

	printf("%d\n", strlen(arr));       //6
	printf("%d\n", strlen(arr+0));     //6
	printf("%d\n", strlen(*arr));      //err
	printf("%d\n", strlen(arr[1]));    //err
	printf("%d\n", strlen(&arr));      //6
	printf("%d\n", strlen(&arr+1));    //随机值
	printf("%d\n", strlen(&arr[0]+1)); //5
	return 0;
}

指针变量

#include <stdio.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));       //4/8 计算的是指针变量p的大小
 	printf("%d\n", sizeof(p+1));     //4/8 计算的是字符b的地址
	printf("%d\n", sizeof(*p));      //1 首元素
	printf("%d\n", sizeof(p[0]));    //1 p[0]==*(p+0)
	printf("%d\n", sizeof(&p));      //4/8 取出的是p的地址
	printf("%d\n", sizeof(&p+1));    //4/8 只要是地址就是 4/8
	printf("%d\n", sizeof(&p[0]+1)); //4/8

	printf("%d\n", strlen(p));       //6 遇到0结束 不包括0
	printf("%d\n", strlen(p+1));     //5
	printf("%d\n", strlen(*p));      //err strlen 需要的是地址
	printf("%d\n", strlen(p[0]));    //err 
	printf("%d\n", strlen(&p));      //随机值 因为它取决于p存放的内容
	printf("%d\n", strlen(&p+1));    //随机值
	printf("%d\n", strlen(&p[0]+1)); //5
	return 0;
}

二维数组

#include <stdio.h>
int main()
{
	int arr[3][4] = { 0 };
	printf("%d\n", sizeof(arr));          //48
	printf("%d\n", sizeof(arr[0][0]));    //4
	printf("%d\n", sizeof(arr[0]));       //16 如果是单独的 arr[0] 放进sizeof 就计算的是一整行的大小
	printf("%d\n", sizeof(arr[0]+1));     //4/8 此时arr[0]没有单独放 就代表首元素的地址 地址+1还是地址
	printf("%d\n", sizeof(*(arr[0]+1)));  //4  第一行第二个元素
	printf("%d\n", sizeof(arr+1));        //4/8 arr代表首元素的地址 arr+1代表第二行的地址
	printf("%d\n", sizeof(*(arr+1)));     //16 第二行的地址解引用就是第二行的大小 sizeof(arr[1])
	printf("%d\n", sizeof(&arr[0]+1));    //4/8 第二行的地址
	printf("%d\n", sizeof(*(&arr[0]+1))); //16 第二行的地址解引用就是第二行的大小 
	printf("%d\n", sizeof(*arr));         //16 arr是首元素的地址 sizeof(*arr) 就是计算第一行的大小 
	printf("%d\n", sizeof(arr[3]));       //16 sizeof内部的表达式不参与实际的运算,只根据其类型的大小 arr[3]==arr[2]==arr[1]==arr[0] 
	return 0;
}

指针的大小是 4/8
地址的大小是 4/8
都取决于32位的电脑还是64位的电脑

详情 指针的大小

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 12:00:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:44:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码