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

devtools/2024/10/15 19:36:25/

目录

1. sizeof和strlen的对⽐

1.1 sizeo

1.2 strlen

1.3 sizeof和strlen的对⽐

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

2.1 ⼀维数组

2.2 字符数组

2.3 ⼆维数组

3. 指针运算笔试题解析

3.1 题⽬1:

3.2 题⽬2

3.3 题⽬3

3.4 题⽬4

3.5 题⽬5

3.6 题⽬6

3.7 题⽬7


1. sizeof和strlen的对⽐

1.1 sizeo

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

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

#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语⾔库函数,功能是求字符串⻓度。函数原型如下:

1 size_t strlen ( const char * str );

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

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

#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的对⽐

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

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

2.1 ⼀维数组

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:

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: 

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: 

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: 

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: 

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: 

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 ⼆维数组

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:

#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

//在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

#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

//假设环境是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

#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

#include <stdio.h>int main()
{char *a[] = {"work","at","alibaba"};char**pa = a;pa++;printf("%s\n", *pa);return 0;
}

3.7 题⽬7

#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;
}


http://www.ppmy.cn/devtools/126312.html

相关文章

AD9680(adc直采芯片)使用说明

写这篇文章之前我是没有使用过AD9680的芯片&#xff0c;但是使用过GMS011芯片&#xff08;是国内24S&#xff09;下的公司出来的芯片&#xff0c;寄存器和管脚全对标。 在这里我就大概说一下芯片的说用方法 一、硬件设计 该芯片支持双通道射频直采 支持协议JESD204B 14位 采样…

【模型】Self-Attention

Self-Attention 机制&#xff08;Self-Attention Mechanism&#xff09;是近年来深度学习中&#xff0c;特别是自然语言处理&#xff08;NLP&#xff09;任务中广泛应用的一种机制&#xff0c;它最初出现在Transformer架构中&#xff0c;用于捕捉序列数据中的依赖关系。该机制的…

2012年国赛高教杯数学建模A题葡萄酒的评价解题全过程文档及程序

2012年国赛高教杯数学建模 A题 葡萄酒的评价 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进行品尝后对其分类指标打分&#xff0c;然后求和得到其总分&#xff0c;从而确定葡萄酒的质量。酿酒葡萄的好坏与所酿葡萄酒的质量有直接的关系&…

自动驾驶高频面试题及答案

目录 高频面试题及答案1. 什么是自动驾驶?2. 自动驾驶的主要传感器有哪些?3. 自动驾驶中的感知与决策有什么区别?4. 解释一下自动驾驶的等级划分。5. 如何处理自动驾驶中的安全性问题?6. 自动驾驶车辆如何实现环境感知?7. 在自动驾驶中,如何处理车辆之间的通信?8. 自动驾…

【内网映射】frps实现内网映射

1. 简介 在当今互联网时代,远程访问内网资源已成为一种常见需求。无论是在家访问办公室的电脑,还是远程管理家庭NAS,内网映射都是一种强大的解决方案。 本文将详细介绍如何使用frp(Fast Reverse Proxy)来实现这一目标。 1.1 frp frp是一个高性能的反向代理应用,可以帮助您轻…

Python爬虫高效数据爬取方法

大家好!今天我们来聊聊Python爬虫中那些既简洁又高效的数据爬取方法。作为一名爬虫工程师,我们总是希望用最少的代码完成最多的工作。下面我ll分享一些在使用requests库进行网络爬虫时常用且高效的函数和方法。 1. requests.get() - 简单而强大 requests.get()是我们最常用的…

矩阵相关算法

矩阵旋转90度 给定一个 n n 的二维矩阵 matrix 表示一个图像&#xff0c;请你将图像顺时针旋转 90 度。 #include <iostream> #include <vector>using namespace std;void rotate(vector<vector<int>>& matrix) {int n matrix.size();// 第一步…

Three.js 快速入门 --- 鼠标操作三维场景

1、准备工作 需要引入 OrbitControls.js <script src"./three.js-r102/examples/js/controls/OrbitControls.js"></script>2、代码实现 function render() {renderer.render(scene,camera);//执行渲染操作 } render(); var controls new THREE.OrbitC…