👦个人主页:@Weraphael
✍🏻作者简介:目前是C语言学习者
✈️专栏:C语言刷题
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍
前言
- 对指针或者数组的某个知识点不了解,请参考以下链接
数组篇:深入学习数组
指针篇:初阶指针 + 指针进阶
- 重要的知识点
①sizeof(数组名),sizeof内部单独放一个数组名,计算的是整个数组的大小,单位:字节
②&数组名,取出的是整个数组的地址
③除此之外所有的数组名都表示首元素地址
④指针的大小为4/8个字节(取决于环境)
目录
一、数组笔试题
1、一维数组
2、字符数组
(1)sizeof
(2)strlen
3、 字符串
(1)sizeof
(2)strlen
4、字符指针
(1)sizeof
(2)strlen
5、二维数组
二、指针笔试题
一、数组笔试题
1、一维数组
#include <stdio.h>
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;
}
【答案解析】
【程序结果】
x86环境下
2、字符数组
(1)sizeof
#include <stdio.h>
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;
}
【答案解析】
【程序结果】
x86环境
(2)strlen
strlen只求字符串长度,统计的是'\0'之前出现的字符个数(不包括\0),找到'\0'才算结束。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n",strlen(arr));
printf("%d\n",strlen(arr + 0));
printf("%d\n",strlen(*arr));
printf("%d\n",strlne(arr[1]));
printf("%d\n",strlen(&arr));
printf("%d\n",strlen(&arr + 1));
printf("%d\n",strlen(&arr[0] + 1));
return 0;
}
【答案解析】
【非法访问】
3、 字符串
(1)sizeof
#include <stdio.h>
int main()
{
char arr[] = "abcdef";
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;
}
【答案解析】
(2)strlen
#include <stdio.h>
#include <string.h>
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、字符指针
(1)sizeof
#include <stdio.h>
int main()
{
char* p = "abcdef";
printf("%d\n",sizeof(p));
printf("%d\n",sizeof(p + 1));
printf("%d\n",sizeof(*p));
printf("%d\n",sizeof(p[0]));
printf("%d\n",sizeof(&p));
printf("%d\n",sizeof(&p + 1));
printf("%d\n",sizeof(&p[0] + 1));
return 0;
}
【答案解析】
(2)strlen
#include <stdio.h>
#include <string.h>
int main()
{
char* p = "abcdef";
printf("%d\n",strlen(p));
printf("%d\n",strlen(p + 1));
printf("%d\n",strlen(*p));
printf("%d\n",strlen(p[0]));
printf("%d\n",strlen(&p));
printf("%d\n",strlen(&p + 1));
printf("%d\n",strlen(&p[0] + 1));
return 0;
}
【答案解析】
5、二维数组
#include <stdio.h>
int main()
{
int arr[3][4] = {0};
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(arr[0][0]));
printf("%d\n",sizeof(arr[0]));
printf("%d\n",sizeof(arr[0] + 1));
printf("%d\n",sizeof(*(arr[0] + 1));
printf("%d\n",sizeof(arr + 1);
printf("%d\n",sizeof(*(arr + 1));
printf("%d\n",sizeof(&arr[0] + 1));
printf("%d\n",sizeof(*(&arr[0] + 1));
printf("%d\n",sizeof(*arr));
printf("%d\n",sizeof(arr[3]));
}
【答案解析】
上半部分
下半部分
二、指针笔试题
第一题
#include <stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int *p = (int*)(&a + 1);
printf("%d,%d\n",*(a + 1),*(p - 1));
return 0;
}
【答案解析】
第二题
#include <stdio.h>
//已知结构体的大小为20个字节
//p的值为0x100000
struct Test
{
int num;
char* name;
short xhz;
char cha[2];
short cxk[4];
}*p;
int main()
{
printf("%p\n",p + 0x1);
printf("%p\n",(unsigned long)p + 0x1);
printf("%p\n",(unsigned int*)p + 0x1);
return 0
}
【答案解析】
【程序运行结果】
第三题
#include <stdio.h>
int main()
{
int arr[4] = {1,2,3,4};
int *p = (int*)(&arr + 1);
int *ptr = (int *)((int)arr + 1);
printf("%x,%x",p[-1],*ptr);
return 0;
}
【答案解析】
第四题
#include <stdio.h>
int main()
{
int a[3][2] = { (0,1),(2,3),(4,5) };
int* p;
p = a[0];
printf("%d\n", p[0]);
return 0;
}
【答案解析】
第五题
#include <stdio.h>
int main()
{
int a[5][5];
int(*p)[4];
p = a;
printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
return 0;
}
【答案解析】
第六题
#include <stdio.h>
int main()
{
int a[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = (int*)(&a + 1);
int* ptr = (int*)(*(a + 1));
printf("%d %d", *(p - 1), *(ptr - 1));
return 0;
}
【答案解析】
第七题
#include <stdio.h>
int main()
{
char* a[] = { "work","at","alibaba" };
char** p = a;
p++;
printf("%s\n", *p);
return 0;
}
【答案解析】
第八题
#include <stdio.h>
int main()
{
char* c[] = { "ENTER","NEW","POINT","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;
}
【答案解析】