当前位置: 首页 > article >正文

深入理解指针(5)

这篇文章就是指针基础部分的最后一篇文章了,之后呢会持续给大家更新一些关于字符指针呀、函数指针呀、还有一些关于指针的拓展内容以便帮助大家更好的理解指针。

sizeof函数

sizeof 是C和C++ 语言中的一个操作符,用于获取一个数据类型或者变量所占用的字节数

示例1:

#include<stdio.h>
int amin() {
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof a);
	printf("%d\n", sizeof(int));
	return 0;
}

示例2:

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    // 获取数组 arr 的大小
    size_t arr_size = sizeof(arr);
    // 获取数组中单个元素的大小
    size_t element_size = sizeof(arr[0]);
    // 计算数组元素个数
    size_t element_count = arr_size / element_size;

    printf("Size of arr: %zu bytes\n", arr_size);
    printf("Size of an element in arr: %zu bytes\n", element_size);
    printf("Number of elements in arr: %zu\n", element_count);

    return 0;
}

示例3:

#include <iostream>

struct Point {
    int x;
    int y;
};

int main() {
    Point p;
    // 获取结构体 Point 的大小
    size_t struct_size = sizeof(Point);
    // 获取结构体变量 p 的大小
    size_t var_size = sizeof(p);

    std::cout << "Size of Point struct: " << struct_size << " bytes\n";
    std::cout << "Size of p variable: " << var_size << " bytes\n";

    return 0;
}

示例4:

#include <iostream>

class MyClass {
private:
    int data;
public:
    MyClass() : data(0) {}
};

int main() {
    MyClass obj;
    // 获取类 MyClass 的大小
    size_t class_size = sizeof(MyClass);
    // 获取类对象 obj 的大小
    size_t obj_size = sizeof(obj);

    std::cout << "Size of MyClass: " << class_size << " bytes\n";
    std::cout << "Size of obj: " << obj_size << " bytes\n";

    return 0;
}

strlen函数

strlen 是C标准库中的一个函数,用于计算字符串的长度

函数原型:

size_t strlen(const char *str);

示例5:

#include <stdio.h>
#include <string.h>

int main() {
    const char *str1 = "abc";
    const char *str2 = "abcd";

    if (strlen(str1) - strlen(str2) < 0) {
        printf("str1 is shorter than str2\n");
    } else {
        printf("str1 is not shorter than str2\n");
    }

    return 0;
}

sizeof函数和strlen函数的对比

两者函数的不同之处

sizeof函数:

1. sizeof是操作符;

2. sizeof计算操作数所占内存的 ⼤⼩,单位是字节

3. 不关注内存中存放什么数据;

strlen函数:

1. strlen是库函数,使⽤需要包含头⽂件 string.h

2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的个数

3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界;

下面两章内容呢都是些基础题,目的在于帮助大家更好的理解指针和数组。

数组和指针笔试题解析

代码1:一维数组

int main() {
	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));
	return 0;
}

同学们思考一下,上面printf函数分别打印出来的都是多少呢?

代码2:字符数组sizeof函数

int main() {
	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));
	return 0;
}

同学们思考一下,上面printf函数分别打印出来的都是多少呢?

代码3:字符数组strlen函数

int main(){
	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));
	return 0;
}

指针运算笔试题解析

代码4:

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

同学们不妨思考一下,程序的结果是什么?

代码5:

#include<stdio.h>
int main() {
	int a[3][2] = { (0,1),(2,3),(4,5) };
	int* p;
	p = a[1];
	printf("%d", p[1]);
	return 0;
}

这道题打印的结果又是什么呢?

代码6:

#include<stdio.h>
int main() {
	int arr[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
	int* ptr1 = (int*)(&arr + 1);
	int* ptr2 = (int*)(*(arr + 1));
	printf("%d %d", *(ptr1 - 1), *(ptr2 - 1));
	return 0;
}

这个程序打印出来的结果为什么不同呢?

代码7:

#include<stdio.h>
int main() {
	char* c[] = { "ENTER","NEW","POINI","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;
}

如果同学们前面的都能看懂不妨来看下这段代码吧!

拓展(复习)

数组名的意义:

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

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

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


http://www.kler.cn/a/533298.html

相关文章:

  • Java/Kotlin HashMap 等集合引发 ConcurrentModificationException
  • 系统URL整合系列视频二(界面原型)
  • 【Redis】主从模式,哨兵,集群
  • Starrocks 对比 Clickhouse
  • Deepseek:网页版OR本地部署版本?
  • Go学习:类型转换需注意的点 以及 类型别名
  • 双系统共用一个蓝牙鼠标
  • 【Leetcode 每日一题 - 补卡】922. 按奇偶排序数组 II
  • OSCP - Other Machines - Blogger
  • 【华为OD机试python】日志采集系统【 E卷 | 2023 Q1 |100分】
  • RabbitMQ中的@Header
  • Maven 依赖管理基础
  • 网络命令
  • Java并发编程面试题:ThreadLocal(8题)
  • windows 剪切板的写入、读取,包括图片,文本内容
  • 代码随想录二刷|回溯1
  • 嵌入式开发:PPM是什么单位
  • 基础篇05-直方图操作
  • 深度整理总结MySQL——Count的工作原理
  • Swagger相关内容整合
  • 【实用小技巧】git如何添加一个文件的一部分修改到暂存区(git add -p)
  • 深入理解 JavaScript 的 Promise:实例方法与静态方法
  • 无法连接到远程扩展主机服务器
  • 如何解决 Vue 应用中的内存泄漏
  • css 之 clip-path
  • 本地大模型编程实战(08)自制聊天机器人(2)