当前位置:网站首页>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停止,跟第一个随机值相差1
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,跳过第一个元素后,计算后面的地址大小,而不是数组里面的内容大小
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. 除此之外所有的数组名都表示首元素的地址。
边栏推荐
- Global and Chinese market of planar waveguide optical splitter 2022-2028: Research Report on technology, participants, trends, market size and share
- Research and investment strategy report of China's electronic hydrogen peroxide industry (2022 Edition)
- HMS core helps baby bus show high-quality children's digital content to global developers
- Daughter love: frequency spectrum analysis of a piece of music
- How should PMP learning ideas be realized?
- What is permission? What is a role? What are users?
- Basic data types in golang
- C language - Introduction - Foundation - syntax - [operators, type conversion] (6)
- Latex download installation record
- Tkinter Huarong Road 4x4 tutorial II
猜你喜欢
ASP. Net to access directory files outside the project website
Ultimate bug finding method - two points
Sword finger offer 30 contains the stack of Min function
Markdown syntax
PHP personal album management system source code, realizes album classification and album grouping, as well as album image management. The database adopts Mysql to realize the login and registration f
2022-2028 global elastic strain sensor industry research and trend analysis report
You can see the employment prospects of PMP project management
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
How to ensure the uniqueness of ID in distributed environment
QTreeView+自定义Model实现示例
随机推荐
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
Multilingual Wikipedia website source code development part II
自动化的优点有哪些?
Some points needing attention in PMP learning
[on February 11, 2022, the latest and most fully available script library collection of the whole network, a total of 23]
Trim leading or trailing characters from strings- Trim leading or trailing characters from a string?
Global and Chinese markets of water heaters in Saudi Arabia 2022-2028: Research Report on technology, participants, trends, market size and share
[C Advanced] file operation (2)
ArrayBuffer
Dede plug-in (multi-function integration)
Implementing expired localstorage cache with lazy deletion and scheduled deletion
Solve the problem of "Chinese garbled MySQL fields"
法向量点云旋转
Global and Chinese market of planar waveguide optical splitter 2022-2028: Research Report on technology, participants, trends, market size and share
Launchpad x | mode
《网络是怎么样连接的》读书笔记 - 集线器、路由器和路由器(三)
Are there any principal guaranteed financial products in 2022?
AMLOGIC gsensor debugging
Mac platform forgets the root password of MySQL
Global and Chinese trisodium bicarbonate operation mode and future development forecast report Ⓢ 2022 ~ 2027