当前位置:网站首页>C语言指针经典面试题——第一弹
C语言指针经典面试题——第一弹
2022-07-04 09:32:00 【头发没有代码多】
目录
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
//结果是16,这里算的是整个数组
printf("%d\n", sizeof(a + 0));
//结果是4或8,这里算的是第一个地址的大小
printf("%d\n", sizeof(*a));
//结果是4,这里算的是首元素大小
printf("%d\n", sizeof(a + 1));
//结果是4或8,这里算的是第二个地址的大小
printf("%d\n", sizeof(a[1]));
//结果是4,这里算的是第二个元素的大小
printf("%d\n", sizeof(&a));
//结果是4或8,这里算的是整个数组的地址大小
printf("%d\n", sizeof(*&a));
//结果是16,这里先是取出整个数组地址,然后对整个数组解引用,也就是算出的是整个数组的大小
printf("%d\n", sizeof(&a + 1));
//结果是4或8,这里跳过了整个数组,计算数组后面的地址大小,所以是4或8,&a的类型是int(*)[4]
printf("%d\n", sizeof(&a[0]));
//结果是4或8,这里算的是第一个元素的地址大小
printf("%d\n", sizeof(&a[0] + 1));
//结果是4或8,这里算的是第二个元素的地址大小
return 0;
}注意:这里&a的类型是int(*)[4],数组指针,
&a+1是跳过整个数组
sizeof()和char型一维数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));
//6,这里计算的是整个数组
printf("%d\n", sizeof(arr + 0));
//4或8,这里计算的是第一个元素的地址
printf("%d\n", sizeof(*arr));
//1,这里计算的是第一个元素的大小
printf("%d\n", sizeof(arr[1]));
//1,哲理计算的是第二个元素的大小
printf("%d\n", sizeof(&arr));
//4或8,这里计算的是整个数组的地址大小
printf("%d\n", sizeof(&arr + 1));
//还是4或8,这里计算的是跳过整个数组之后,整个地址的大小
printf("%d\n", sizeof(&arr[0] + 1));
//还是4或8,这里计算的是第二个元素的地址大小strlen和char型一维数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));
//随机值,这里计算的是整个数组,即从第一个元素开始往后计算直到找到\0位置,随机值是因为这个数组里面没有\0
printf("%d\n", strlen(arr + 0));
//随机值,这里strlen是从第一个元素开始往后数,随机值的值跟上面的值一样
printf("%d\n", strlen(*arr));
//报错,这里传的是第一个元素,第一个元素是一个值,strlen()括号里面的必须是char *类型的指针变量,而这里面的元素是char类型不是char *类型,若把'a'传过去,则相当于把97当作指针穿了过去
printf("%d\n", strlen(arr[1]));
//报错,传的是第二个元素,跟上面的值一样
printf("%d\n", strlen(&arr));
//随机值,跟前面一样,传的是整个地址,整个地址是从第一个元素的地址开始的,随意会产生随机值,由于是从第一个元素开始,所以产生的结果会跟第一个一样
printf("%d\n", strlen(&arr + 1));
//随机值,这里是跳过了整个数组,然后开始计算,遇到\0便停止,跟第一个随机值相差6
printf("%d\n", strlen(&arr[0] + 1));
//随机值,从第二个元素的地址开始计算,遇到\0停止,跟第一个随机值相差1sizeof()和字符串数组
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
//7,有\0
printf("%d\n", sizeof(arr + 0));
//4或8,计算的是地址大小,从第一个元素的地址开始计算
printf("%d\n", sizeof(*arr));
//1,计算的是是第一个元素的大小
printf("%d\n", sizeof(arr[1]));
//1,计算的是第二个元素的大小
printf("%d\n", sizeof(&arr));
//4或8,计算的是整个地址
printf("%d\n", sizeof(&arr + 1));
//4或8,跳过这个数组后,计算后面的地址大小
printf("%d\n", sizeof(&arr[0] + 1));
//4或8,跳过第一个元素后,计算后面的地址大小,而不是数组里面的内容大小sizeof和字符串数组
char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); //7,有\0 printf("%d\n", sizeof(arr + 0)); //4或8,计算的是地址大小,从第一个元素的地址开始计算 printf("%d\n", sizeof(*arr)); //1,计算的是是第一个元素的大小 printf("%d\n", sizeof(arr[1])); //1,计算的是第二个元素的大小 printf("%d\n", sizeof(&arr)); //4或8,计算的是整个地址 printf("%d\n", sizeof(&arr + 1)); //4或8,跳过这个数组后,计算后面的地址大小 printf("%d\n", sizeof(&arr[0] + 1)); //4或8,跳过第一个元素后,计算后面的地址大小,而不是数组里面的内容大小
strlen和字符串
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
//6,遇到\0停止打印
printf("%d\n", strlen(arr + 0));
//6,遇到\0停止打印
printf("%d\n", strlen(*arr));
//报错,传的不是char *类型
printf("%d\n", strlen(arr[1]));
//报错,穿的不是char*类型
printf("%d\n", strlen(&arr));
//6,传的是整个数组地址,从第一个元素的地址开始
printf("%d\n", strlen(&arr + 1));
//随机值,跨过整个数组之后,开始计算遇到\0停止
printf("%d\n", strlen(&arr[0] + 1));
//5,从第二个元素开始计算,遇到\0停止字符指针和sizeof()
char* p = "abcdef";
printf("%d\n", sizeof(p));
//4或8,这里的p是指针,p里面村的是第一个元素的地址,
printf("%d\n", sizeof(p + 1));
//4或8,指向第二个元素的地址
printf("%d\n", sizeof(*p));
//1,第一个元素的大小
printf("%d\n", sizeof(p[0]));
//1,第一个元素的大小
printf("%d\n", sizeof(&p));
//4或8,&p是二级指针
printf("%d\n", sizeof(&p + 1));
//4或8,跨过了整个数组
printf("%d\n", sizeof(&p[0] + 1));
//4或8,从第二个元素开始计算地址的大小字符指针和strlen()
char* p = "abcdef";
printf("%d\n", strlen(p));
//6,p是首元素地址
printf("%d\n", strlen(p + 1));
//5,从第二个元素开始计算
printf("%d\n", strlen(*p));
//报错,因为穿的是一个值,不是char *类型的
printf("%d\n", strlen(p[0]));
//报错,传的是一个值,不是char *类型的
printf("%d\n", strlen(&p));
//随机值,p是一个一级指针,&p就是一个二级指针,也就是说这里的strlen是从p的地址开始向后数的遇到\0停止
printf("%d\n", strlen(&p + 1));
//随机值,跨过了整个数组,然后开始计算遇到\0位置
printf("%d\n", strlen(&p[0] + 1));
//随机值,从第一个元素开始计算遇到\0为止,这个和上面的相差的数字也是随机值,不是一个确定的数,因为他们遇到\0的情况不相同
//倒数第二个和倒数第一个相差的值,是一个随机值,因为&p是从p的地址开始数,当没到&p[0]+1时,可能会出现\0也有可能不会出现\0,而&p[0]+1,时从第二个元素的地址开始数,什么时候遇到\0则说不准 

&p+1和&p[0]+1结果相差为随机值的原因,有可能在p[0]+1往右移动且没到达&p+1的时候遇到\0,也有可能会和&p+1遇到同一个\0,由于这里的\0具有不确定性,所以他们俩者相差的就是一个随机值。
二维数组和sizeof()
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));
//48,这里计算的是整个数组的大小
printf("%d\n", sizeof(a[0][0]));
//4,这里计算第一个元素的大小
printf("%d\n", sizeof(a[0]));
//16,a[0]第一行元素的大小
printf("%d\n", sizeof(a[0] + 1));
//4/8,这里的a[0]不再单独放在()内部,有+1的操作,所以这里的a[0]表示首元素的地址,+1就表示第二个元素地址的大小,所以这里的是地址
printf("%d\n", sizeof(*(a[0] + 1)));
//4,这个是第一行,第二个元素的大小
printf("%d\n", sizeof(a + 1));
//4/8,a有+1的操作,所以a表示首元素地址,即第一行,a+1就是第二行的地址,由于算的是地址所以是4/8
printf("%d\n", sizeof(*(a + 1)));
//16,第二行元素的大小
printf("%d\n", sizeof(&a[0] + 1));
//4/8,第二行的地址
printf("%d\n", sizeof(*(&a[0] + 1)));
//16,第二行的数组大小
printf("%d\n", sizeof(*a));
//16,a表示首元素地址,*a就是解引用,所以是16
printf("%d\n", sizeof(a[3]));总结
数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。3. 除此之外所有的数组名都表示首元素的地址。
边栏推荐
- Summary of the most comprehensive CTF web question ideas (updating)
- 2022-2028 global visual quality analyzer industry research and trend analysis report
- Lauchpad X | 模式
- QTreeView+自定义Model实现示例
- Are there any principal guaranteed financial products in 2022?
- Golang defer
- MySQL foundation 02 - installing MySQL in non docker version
- SSM online examination system source code, database using mysql, online examination system, fully functional, randomly generated question bank, supporting a variety of question types, students, teache
- Log cannot be recorded after log4net is deployed to the server
- Mac platform forgets the root password of MySQL
猜你喜欢

Function comparison between cs5261 and ag9310 demoboard test board | cost advantage of cs5261 replacing ange ag9310

PHP student achievement management system, the database uses mysql, including source code and database SQL files, with the login management function of students and teachers

If you can quickly generate a dictionary from two lists

Solve the problem of "Chinese garbled MySQL fields"

2022-2028 global elastic strain sensor industry research and trend analysis report

How does idea withdraw code from remote push

2022-2028 global optical transparency industry research and trend analysis report

Jianzhi offer 09 realizes queue with two stacks

2022-2028 global tensile strain sensor industry research and trend analysis report

2022-2028 global intelligent interactive tablet industry research and trend analysis report
随机推荐
Explanation of for loop in golang
Daughter love in lunch box
2022-2028 global edible probiotic raw material industry research and trend analysis report
法向量点云旋转
Report on investment analysis and prospect trend prediction of China's MOCVD industry Ⓤ 2022 ~ 2028
Analysis report on the development status and investment planning of China's modular power supply industry Ⓠ 2022 ~ 2028
Global and Chinese market of sampler 2022-2028: Research Report on technology, participants, trends, market size and share
20220701 barbarat lemma proof
ASP. Net to access directory files outside the project website
Svg image quoted from CodeChina
Service call feign of "micro service"
Pueue data migration from '0.4.0' to '0.5.0' versions
China electronic grade sulfur trioxide Market Forecast and investment strategy report (2022 Edition)
The old-fashioned synchronized lock optimization will make it clear to you at once!
Trees and graphs (traversal)
Problems encountered by scan, scanf and scanln in golang
Get the source code in the mask with the help of shims
Function comparison between cs5261 and ag9310 demoboard test board | cost advantage of cs5261 replacing ange ag9310
Mac platform forgets the root password of MySQL
2022-2028 global seeder industry research and trend analysis report
