前言:本章讲的是指针面试题,但是在这里我想提一下:strlen 和 sizeof 的区别。
strlen : 是求字符串的长度,关注的是 ‘\0’, 计算的是’\0’ 之前出现的字符串个数。是一个库函数,只针对字符串。
sizeof :只关注占用内存空间的大小,不在乎内存中存放的是什么,sizeof 是操作符。
一 、 数组名指针面试题
一维数组
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
//数组名是首元素地址,但有两个除外
//sizeof(数组名)--数组名表示整个数组的大小
//&数组名 -- 数组名表示整个数组
// 一维数组,有些答案是4/8,因为平台不一样,32位系统的是4,64位系统的是8
int arr[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(arr));//16, sizeof(数组名) - 计算的是数组的总大小,单位字节是16
printf("%d\n", sizeof(arr + 0));//4/8 , 数组名这里表示首元素的地址,arr + 0还是首元素的地址
//地址的大小就是4/8个字节
printf("%d\n", sizeof(*arr));//4,数组名是首元素的地址,*arr就是首元素的值
printf("%d\n", sizeof(arr + 1));//4/8,数组名这里表示首元素的地址,arr+1就表示第二个元素的地址
printf("%d\n", sizeof(arr[1]));//4,arr[1]表示的是第二个元素的值
printf("%d\n", sizeof(&arr));//4/8,&arr表示的是整个数组的地址,但是整个数组的地址还是地址,地址的大小就是4/8
printf("%d\n", sizeof(*&arr));//16,&arr表示的是整个数组的地址,*&arr解引用访问数组,sizeof计算的是数组的大小
printf("%d\n", sizeof(&arr + 1));//4/8,&arr是整个数组的地址,&arr + 1 就是跳过整个数组,但还是地址
printf("%d\n", sizeof(&arr[0]));//4/8,&arr[0]是首元素的地址
printf("%d\n", sizeof(&arr[0] + 1));//4/8,&arr[0] + 1 是第二个元素的地址
//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//sizeof计算的是数组的大小,6*1= 6(字节)
printf("%d\n", sizeof(arr + 0));//4/8,arr是数组首元素的地址,arr+0还是数组首元素的地址,地址的大小就是4/8字节
printf("%d\n", sizeof(*arr));//1,arr是首元素的地址,*arr就是首元素,首元素是字符大小是一个字节
printf("%d\n", sizeof(arr[1]));//1,arr[1]数组第二个元素
printf("%d\n", sizeof(&arr));//4/8,&arr是数组的地址,是地址就是4/8字节
printf("%d\n", sizeof(&arr + 1));//4/8,&arr + 1跳过整个数组后的地址,是地址就是4/8字节
printf("%d\n", sizeof(&arr[0] + 1));//4/8,数组第二个元素的地址
//strlen是库函数 求的是字符串的大小,它是通过指针(指针变量,存储地址)去访问字符串的,遇到了\0的地址就会停下来
//所以要给一个地址strlen函数
printf("%d\n", strlen(arr));//随机值,arr是首元素的地址
printf("%d\n", strlen(arr + 0));//随机值,arr + 0也是首元素的地址
printf("%d\n", strlen(*arr));//err,*arr 是数组首元素
printf("%d\n", strlen(arr[1]));//err,arr[1] 是数组首元素
printf("%d\n", strlen(&arr));//随机值,&arr是数组的地址
printf("%d\n", strlen(&arr + 1));//随机值 - 6,&arr + 1是跳个数组后的地址
printf("%d\n", strlen(&arr[0] + 1));//随机值 - 1,&arr[0] + 1,时候数组第二个元素的地址
return 0;
}
二维数组
知识点:我们要把二维数组arr[n][m],看成 n 个一维数组,也就是把二维数组中的每一行,当成一个一维数组。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int arr[4][3] = { 0 };
printf("%d\n", sizeof(arr[0]));//12,arr[0]相当于数组名,数组名放在sizeof内部,求的是数组的大小,单位是字节
printf("%d\n", sizeof(arr[4]));//12,虽然数组没有第四行,但是sizeof不会去找到arr[4]这一行,它只是一个操作符,根据arr数组名去求
printf("%d\n", sizeof(arr));//48,数组名,求得是数组的大小
printf("%d\n",sizeof(&arr[0]));//4,&arr[0],取出的是数组第一行的地址
printf("%d\n", sizeof(&arr[0] + 1));//4,&arr[0] + 1 求的是数组第二行的地址
printf("%d\n", sizeof(arr[0] + 1));//4,求的是第一行第二个数组的地址
return 0;
}