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