概述
32位环境下
一、一维数组
int main()
{
int a[] = { 1,2,3,4 };
printf("%dn", sizeof(a)); //16数组名a单独放在sizeof内部,
//数组名表示整个数组,计算的是整个数组的大小
printf("%dn", sizeof(a + 0));//4 a表示首元素的地址,a + 0还是首元素的地址
printf("%dn", sizeof(*a));//4 a是首元素地址,*a就是地址
printf("%dn", sizeof(a + 1));//4 a表示首元素的地址,a + 1还是第二个元素的地址
printf("%dn", sizeof(a[1]));//4 a[1]就是第二个元素
printf("%dn", sizeof(&a));//4 &a拿到的是整个数组的地址,地址也是4个字节
printf("%dn", sizeof(*&a));//16 &a拿到的是整个数组, 就和sizeof(a)是一样的
printf("%dn", sizeof(&a + 1));//4 &a拿到的是整个数组的地址,a+1就是跳过整个数组的地址也是4个字节
printf("%dn", sizeof(&a[0]));//4 拿到的是首元素的地址
printf("%dn", sizeof(&a[0] + 1));//4 跳过一个元素的地址
return 0;
}
二、字符数组
int main()
{
char arr[] = { 'a','b','c','d','e','f' };//6个字符
printf("%dn", sizeof(arr));//6 sizeof(arr) -- 计算的是整个数组的大小
printf("%dn", sizeof(arr + 0));//4 arr + 0 相当于首元素地址,所以计算的是地址的大小
printf("%dn", sizeof(*arr));//1 arr是数组名,是首元素的地址,*arr就是第一个元素
printf("%dn", sizeof(arr[1]));//1 计算的是第二个元素的大小
printf("%dn", sizeof(&arr));//4 &arr -- 拿到的是整个数组的地址,所以计算的是地址的大小
printf("%dn", sizeof(&arr + 1));//4 &arr+1计算的是跳过整个数组的地址,所以还是计算地址的大小
printf("%dn", sizeof(&arr[0] + 1));//4 拿到的是第二个元素的地址
return 0;
}
int main()
{
char arr[] = { 'a','b','c','d','e','f' };//6个字符
//strlen(arr) -- 计算的 之前字符串的长度
printf("%dn", strlen(arr));//不确定,因为arr数组里面没有存放 ,所以不知道数组之后在哪里遇见
printf("%dn", strlen(arr + 0));//不确定
//printf("%dn", strlen(*arr));//*arr是第一个元素,strlen函数求的是 之前的字符串,参数不匹配
//printf("%dn", strlen(arr[1]));
printf("%dn", strlen(&arr));不确定
printf("%dn", strlen(&arr + 1));//不确定
printf("%dn", strlen(&arr[0] + 1));//不确定
return 0;
}
int main()
{
char arr[] = "abcdef";
printf("%dn", sizeof(arr));//7 sizeof(arr) -- 计算的是整个字符串的大小
printf("%dn", sizeof(arr + 0));//4 sizeof(arr + 0) -- 拿到的首元素地址,所以是计算地址的大小
printf("%dn", sizeof(*arr));//1 *arr -- 相当于是'a'
printf("%dn", sizeof(arr[1]));//1 arr[1] -- 'b'
printf("%dn", sizeof(&arr));// 4 &arr 计算的是地址的大小
printf("%dn", sizeof(&arr + 1));//4
printf("%dn", sizeof(&arr[0] + 1));//4 &arr[0]拿到的也是地址
return 0;
}
int main()
{
char arr[] = "abcdef";
printf("%dn", strlen(arr));//6
printf("%dn", strlen(arr + 0));//6
printf("%dn", strlen(*arr));// 报错
printf("%dn", strlen(arr[1]));// 报错
printf("%dn", strlen(&arr));//6
printf("%dn", strlen(&arr + 1));//随机值
printf("%dn", strlen(&arr[0] + 1)); //5
return 0;
}
int main()
{
char* p = "abcdef";
printf("%dn", sizeof(p));//4 p是地址
printf("%dn", sizeof(p + 1));//4 p+1也是地址
printf("%dn", sizeof(*p));//1 *p - 'a'
printf("%dn", sizeof(p[0]));//1 p[0] - 'a'
printf("%dn", sizeof(&p));//4 &p是地址
printf("%dn", sizeof(&p + 1));//4 &p + 1 跳过一个元素的地址
printf("%dn", sizeof(&p[0] + 1));//4 跳过一个元素的地址
return 0;
}
int main()
{
char* p = "abcdef";
printf("%dn", strlen(p));//6
printf("%dn", strlen(p + 1));//5
//printf("%dn", strlen(*p));//err
//printf("%dn", strlen(p[0]));//err
printf("%dn", strlen(&p));//随机值,&p是拿到p的地址,但是p和字符串abcdef是两块不同的内存空间
printf("%dn", strlen(&p + 1));//随机值
printf("%dn", strlen(&p[0] + 1));//5
return 0;
}
三、二维数组
int main()
{
int a[3][4] = { 0 };
printf("%dn", sizeof(a));//12*4
printf("%dn", sizeof(a[0][0]));//4
printf("%dn", sizeof(a[0]));//16
printf("%dn", sizeof(a[0] + 1));//4 a[0]表示二维数组第一行的地址,第一行首元素的地址
//a[0]+1第一行第二个元素的地址也是地址
printf("%dn", sizeof(*(a[0] + 1)));//4
printf("%dn", sizeof(a + 1));//4 a是二维数组名,是第一行的地址,a+1是第二行的地址
printf("%dn", sizeof(*(a + 1)));//16,计算的是第二行的大小
printf("%dn", sizeof(&a[0] + 1));//4
printf("%dn", sizeof(*(&a[0] + 1)));//16 计算的是第二行的大小
printf("%dn", sizeof(*a));//16 第一行的地址解引用,拿到的是第一行
printf("%dn", sizeof(a[3]));//16
return 0;
}
总结:
数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。
四、指针笔试题
4.1、笔试题1
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int* ptr = (int*)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
//程序的结果是什么?
4.2、笔试题2
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
p = (struct Test*)0x100000; // 0000 0000 0000 0001 0000 0000 0000 0000 0000
printf("%pn", p + 0x1);
printf("%pn", (unsigned long)p + 0x1);
printf("%pn", (unsigned int*)p + 0x1);
return 0;
}
4.3、笔试题3
int main()
{
int a[4] = { 1, 2, 3, 4 };
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);
printf("%x,%x", ptr1[-1], *ptr2);
return 0;
}
4.4、笔试题4
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int* p;
p = a[0];
printf("%d", p[0]);
return 0;
}
最后
以上就是坚强自行车为你收集整理的C语言指针和数组笔试题一、一维数组二、字符数组三、二维数组四、指针笔试题的全部内容,希望文章能够帮你解决C语言指针和数组笔试题一、一维数组二、字符数组三、二维数组四、指针笔试题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复