理解C语言之深入理解指针(五)

目录

[1. sizeof和strlen的对⽐](#1. sizeof和strlen的对⽐)

[1.1 sizeo](#1.1 sizeo)

[1.2 strlen](#1.2 strlen)

[1.3 sizeof和strlen的对⽐](#1.3 sizeof和strlen的对⽐)

[2. 数组和指针笔试题解析](#2. 数组和指针笔试题解析)

[2.1 ⼀维数组](#2.1 ⼀维数组)

[2.2 字符数组](#2.2 字符数组)

[2.3 ⼆维数组](#2.3 ⼆维数组)

[3. 指针运算笔试题解析](#3. 指针运算笔试题解析)

[3.1 题⽬1:](#3.1 题⽬1:)

[3.2 题⽬2](#3.2 题⽬2)

[3.3 题⽬3](#3.3 题⽬3)

[3.4 题⽬4](#3.4 题⽬4)

[3.5 题⽬5](#3.5 题⽬5)

[3.6 题⽬6](#3.6 题⽬6)

[3.7 题⽬7](#3.7 题⽬7)


1. sizeof和strlen的对⽐

1.1 sizeo

在学习操作符的时候,我们学习了sizeofsizeof 计算变量所占内存内存空间⼤⼩的,单位是 字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。

sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。 ⽐如:

cpp 复制代码
#inculde <stdio.h>

int main()
{
 int a = 10;
 printf("%d\n", sizeof(a));
 printf("%d\n", sizeof a);
 printf("%d\n", sizeof(int));
 
 return 0;
}

1.2 strlen

strlen 是C语⾔库函数,功能是求字符串⻓度。函数原型如下:

cpp 复制代码
1 size_t strlen ( const char * str );

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。

strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。

cpp 复制代码
#include <stdio.h>

int main()
{
 char arr1[3] = {'a', 'b', 'c'};
 char arr2[] = "abc";
 printf("%d\n", strlen(arr1));
 printf("%d\n", strlen(arr2));
 
 printf("%d\n", sizeof(arr1));
 printf("%d\n", sizeof(arr2));
 return 0;
}

1.3 sizeofstrlen的对⽐

|-------------------------------|-----------------------------------------------|
| sizeof | strlen |
| sizeof是操作符 | strlen 是库函数,使⽤需要包含头⽂件 string.h |
| sizeof计算操作数所占内存的 ⼤⼩,单位是字节 | srtlen 是求字符串⻓度的,统计的是 \0 之前字符的隔个数 |
| 不关注内存中存放什么数据 | 关注内存中是否有 \0 ,如果没有**\0** ,就会持续往后找,可能 会越界 |

2. 数组和指针笔试题解析

2.1 ⼀维数组

cpp 复制代码
int a[] = {1,2,3,4};

printf("%d\n",sizeof(a));

printf("%d\n",sizeof(a+0));

printf("%d\n",sizeof(*a));

printf("%d\n",sizeof(a+1));

printf("%d\n",sizeof(a[1]));

printf("%d\n",sizeof(&a));

printf("%d\n",sizeof(*&a));

printf("%d\n",sizeof(&a+1));

printf("%d\n",sizeof(&a[0]));

printf("%d\n",sizeof(&a[0]+1));

2.2 字符数组

代码1:

cpp 复制代码
char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", sizeof(arr));

printf("%d\n", sizeof(arr+0));

printf("%d\n", sizeof(*arr));

printf("%d\n", sizeof(arr[1]));

printf("%d\n", sizeof(&arr));

printf("%d\n", sizeof(&arr+1));

printf("%d\n", sizeof(&arr[0]+1));

代码2:

cpp 复制代码
char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", strlen(arr));

printf("%d\n", strlen(arr+0));

printf("%d\n", strlen(*arr));

printf("%d\n", strlen(arr[1]));

printf("%d\n", strlen(&arr));

printf("%d\n", strlen(&arr+1));

printf("%d\n", strlen(&arr[0]+1));

代码3:

cpp 复制代码
char arr[] = "abcdef";

printf("%d\n", sizeof(arr));

printf("%d\n", sizeof(arr+0));

printf("%d\n", sizeof(*arr));

printf("%d\n", sizeof(arr[1]));

printf("%d\n", sizeof(&arr));

printf("%d\n", sizeof(&arr+1));

printf("%d\n", sizeof(&arr[0]+1));

代码4:

cpp 复制代码
char arr[] = "abcdef";

printf("%d\n", strlen(arr));

printf("%d\n", strlen(arr+0));

printf("%d\n", strlen(*arr));

printf("%d\n", strlen(arr[1]));

printf("%d\n", strlen(&arr));

printf("%d\n", strlen(&arr+1));

printf("%d\n", strlen(&arr[0]+1));

代码5:

cpp 复制代码
char *p = "abcdef";

printf("%d\n", sizeof(p));

printf("%d\n", sizeof(p+1));

printf("%d\n", sizeof(*p));

printf("%d\n", sizeof(p[0]));

printf("%d\n", sizeof(&p));

printf("%d\n", sizeof(&p+1));

printf("%d\n", sizeof(&p[0]+1));

代码6:

cpp 复制代码
char *p = "abcdef";

printf("%d\n", strlen(p));

printf("%d\n", strlen(p+1));

printf("%d\n", strlen(*p));

printf("%d\n", strlen(p[0]));

printf("%d\n", strlen(&p));

printf("%d\n", strlen(&p+1));

printf("%d\n", strlen(&p[0]+1));

2.3 ⼆维数组

cpp 复制代码
int a[3][4] = {0};

printf("%d\n",sizeof(a));

printf("%d\n",sizeof(a[0][0]));

printf("%d\n",sizeof(a[0]));

printf("%d\n",sizeof(a[0]+1));

printf("%d\n",sizeof(*(a[0]+1)));

printf("%d\n",sizeof(a+1));

printf("%d\n",sizeof(*(a+1)));

printf("%d\n",sizeof(&a[0]+1));

printf("%d\n",sizeof(*(&a[0]+1)));

printf("%d\n",sizeof(*a));

printf("%d\n",sizeof(a[3]));

数组名的意义:

  1. sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩

  2. &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址。

  3. 除此之外所有的数组名都表⽰⾸元素的地址。

3. 指针运算笔试题解析

3.1 题⽬1:

cpp 复制代码
#include <stdio.h>

int main()
{
 int a[5] = { 1, 2, 3, 4, 5 };
 int *ptr = (int *)(&a + 1);
 printf( "%d,%d", *(a + 1), *(ptr - 1));
 return 0;
}

//程序的结果是什么?  

3.2 题⽬2

cpp 复制代码
//在X86环境下 

//假设结构体的⼤⼩是20个字节 

//程序输出的结果是啥? 

struct Test

{
int Num;
 char *pcName;
 short sDate;
 char cha[2];
 short sBa[4];
}*p = (struct Test*)0x100000;

int main()
{
 printf("%p\n", p + 0x1);
 printf("%p\n", (unsigned long)p + 0x1);
 printf("%p\n", (unsigned int*)p + 0x1);
 return 0;
}

3.3 题⽬3

cpp 复制代码
#include <stdio.h>

int main()
{
 int a[3][2] = { (0, 1), (2, 3), (4, 5) };
 int *p;
 p = a[0];
 printf( "%d", p[0]);
 return 0;
}

3.4 题⽬4

cpp 复制代码
//假设环境是x86环境,程序输出的结果是啥? 

#include <stdio.h>

int main()
{
 int a[5][5];
 int(*p)[4];
 p = a;
 printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
 return 0;
}

3.5 题⽬5

cpp 复制代码
#include <stdio.h>

int main()
{
 int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 int *ptr1 = (int *)(&aa + 1);
 int *ptr2 = (int *)(*(aa + 1));
 printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
 return 0;
}

3.6 题⽬6

cpp 复制代码
#include <stdio.h>

int main()
{
 char *a[] = {"work","at","alibaba"};
 char**pa = a;
 pa++;
 printf("%s\n", *pa);
 return 0;
}

3.7 题⽬7

cpp 复制代码
#include <stdio.h>

int main()
{
 char *c[] = {"ENTER","NEW","POINT","FIRST"};
 char**cp[] = {c+3,c+2,c+1,c};
 char***cpp = cp;
 printf("%s\n", **++cpp);
 printf("%s\n", *--*++cpp+3);
 printf("%s\n", *cpp[-2]+3);
 printf("%s\n", cpp[-1][-1]+1);
 return 0;
}
相关推荐
鱼在树上飞20 小时前
乘积最大子数组
算法
H_z___20 小时前
Codeforces Round 1070 (Div. 2) A~D F
数据结构·算法
网易独家音乐人Mike Zhou21 小时前
【嵌入式模块芯片开发】LP87524电源PMIC芯片配置流程,给雷达供电的延时上电时序及API函数
c语言·stm32·单片机·51单片机·嵌入式·电源·毫米波雷达
LCG米21 小时前
嵌入式Python工业环境监测实战:MicroPython读取多传感器数据
开发语言·人工智能·python
自学小白菜21 小时前
每周刷题 - 第三周 - 双指针专题 - 02
python·算法·leetcode
小立爱学习21 小时前
ARM64 指令 --- CASP / CASPA / CASPL / CASPAL
linux·c语言
杜子不疼.21 小时前
【LeetCode76_滑动窗口】最小覆盖子串问题
算法·哈希算法
ComputerInBook21 小时前
代数基本概念理解——特征向量和特征值
人工智能·算法·机器学习·线性变换·特征值·特征向量
不能只会打代码21 小时前
力扣--3433. 统计用户被提及情况
java·算法·leetcode·力扣
武汉唯众智创21 小时前
职业院校C语言程序设计(AIGC版)课程教学解决方案
c语言·开发语言·aigc·程序设计·c语言程序设计·c语言程序设计实训室