深入理解指针(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. 除此之外所有的数组名都表⽰⾸元素的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值