指针和数组笔试题

本文详细讲解了C语言中数组的基本概念,包括一维数组和字符数组,重点阐述了sizeof运算符用于计算数组或类型大小,以及strlen函数用于计算字符串长度的用法。通过实例展示了各种情况下sizeof和strlen的计算结果,强调了数组名在不同上下文中的含义变化。
摘要由CSDN通过智能技术生成

目录

 

一.必备知识

1. 数组名

         2.sizeof

3.strlen

 二.一维数组

三.字符数组

四.二维数组 


 

一.必备知识

1. 数组名

数组名表示整个数组的情况只有两种:

sizeof(数组名) --计算的是整个数组的大小

&数组名 --取出的是整个数组的地址

2.sizeof

用于计算类型或者对象的大小

sizeof是运算符,不是函数

3.strlen

计算字符串的长度,找到\0为止。

strlen作为函数,接收的是一个字符串的地址,返回的是int。

 二.一维数组

#include<stdio.h>
int main()
{
    int a[] = { 1,2,3,4 };
    printf("%d\n", sizeof(a));                          // 16               
   sizeof(数组名)代表计算整个数组大小
    printf("%d\n", sizeof(a + 0));                    // 4/8
   a代表首元素地址,偏移0个地址,计算地址,一个地址4字节
     printf("%d\n", sizeof(*a));                         // 4/8
   a代表首元素地址,*a表示对a[0]解引用,一个元素int类型,4字节
    printf("%d\n", sizeof(a + 1));                    // 4/8
   a代表首元素地址,偏移1个地址,计算地址,一个地址4字节
    printf("%d\n", sizeof(a[1]));                      // 4
   a[1]代表第二个元素,即2,2是int型。4字节
    printf("%d\n", sizeof(&a));                       // 4/8
   &a,取出的是整个数组的地址,计算地址,地址4字节
    printf("%d\n", sizeof(*&a));                        // 16 
   &a,取出整个数组的地址,解引用,取出整个数组,整个数组是int型即4*4=16字节
    printf("%d\n", sizeof(&a + 1));                // 4/8
   &a取出整个数组的地址,+1跳过这个数组,此时已不在这个数组之内,但sizeof不会进行     访问,所以不会非法访问错误。而计算地址,地址4字节
    printf("%d\n", sizeof(&a[0]));                  // 4/8
   &a[0]计算第一个元素的地址,地址4字节
    printf("%d\n", sizeof(&a[0] + 1));            // 4/8
   &a[0]取出第一个元素的地址,偏移1个地址,计算地址,地址4字节

三.字符数组

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));                            // 6
sizeof(数组名)表示计算整个数组大小,一个元素char大小,即6*1=6字节
printf("%d\n", sizeof(arr+0));                       // 4/8
arr表示数组首元素地址,偏移0个地址,计算地址,一个地址4字节
printf("%d\n", sizeof(*arr));                          // 1
arr表示首元素地址,对首元素地址解引用 取出'a',它的大小是1字节
printf("%d\n", sizeof(arr[1]));                      // 1
计算第二个元素的大小,1字节
printf("%d\n", sizeof(&arr));                        // 4/8
&arr表示取出整个数组的地址,计算地址,地址4字节
printf("%d\n", sizeof(&arr+1));                   // 4/8
&arr表示取出整个数组的地址,偏移1个地址,此时已不在arr数组之内,但并没有访问,不会形成非法访问错误,计算地址,地址4字节
printf("%d\n", sizeof(&arr[0]+1));              // 4/8 
&arr[0]取出一个元素的地址,偏移1个地址,计算地址,地址4字节
printf("%d\n", strlen(arr));                         // 随机数
数组名没有放在sizeof里,代表首元素的地址,看似为arr的长度,其实数组arr没有\0结尾,strlen找不到结束标志,会一直计算,知道找到\0为止。
printf("%d\n", strlen(arr+0));                     // 随机数
首元素地址偏移0个地址,代表首元素地址,和上面一种情况
printf("%d\n", strlen(*arr));                          // err
arr表示首元素地址,解引用表示第一个元素,strlen接收的是地址,非法
printf("%d\n", strlen(arr[1]));                       // err
arr[1]是第二个元素,不是地址,非法 
printf("%d\n", strlen(&arr));                        // 随机数
&arr取出整个数组的地址,实质上传过去的也还是首元素地址,但arr没有\0结束,将会生成随机数。
printf("%d\n", strlen(&arr+1));                    // 随机数
&arr取出整个数组的地址,+1偏移1个地址,不知道在哪去了,当然也不知道\0在哪,还是随即数
printf("%d\n", strlen(&arr[0]+1));
&arr[0]取出第一个元素的地址,偏移1个地址,但是arr还是没有\0, 还是随机数
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));                          // 7(6+1)别忘记\0
sizeof(数组名)表示计算整个数组的大小
printf("%d\n", sizeof(arr+0));                     // 4/8
arr表示首元素地址,偏移0个地址,表示第一个元素地址大小,4字节
printf("%d\n", sizeof(*arr));                        // 1
arr表示首元素地址,解引用表示第一个元素,第一个元素char类型,1个字节
printf("%d\n", sizeof(arr[1]));                     // 1
arr[1]表示第二个元素,即'b' ,1个字节
printf("%d\n", sizeof(&arr));                      // 4/8
&arr取出整个数组的地址,传过去的其实还是数组首元素的地址,地址4个字节
printf("%d\n", sizeof(&arr+1));                  // 4/8
&arr取出整个数组的地址,+1偏移一个地址,计算的还是地址,地址4个字节
printf("%d\n", sizeof(&arr[0]+1));              // 4/8
&arr[0]取出第一个元素的地址,+1偏移1个地址,计算的还是地址,地址4个字节
printf("%d\n", strlen(arr));                         // 6
arr代表首元素地址,传首元素地址,计算arr的长度,6
printf("%d\n", strlen(arr+0));                     // 6
arr代表首元素地址,+0偏移0个地址,还是计算arr的长度, 6
printf("%d\n", strlen(*arr));                        // err
首元素解引用,没有传地址,错误
printf("%d\n", strlen(arr[1]));                     // err
arr[1]:第二个元素,没有传地址,错误
printf("%d\n", strlen(&arr));                      // 6
&arr取出arr的地址,计算的是arr的长度, 6
printf("%d\n", strlen(&arr+1));                 // 随机数
&arr取出arr地址,+1偏移一个地址,已不在arr之内,随机数
printf("%d\n", strlen(&arr[0]+1));           // 5
&arr[0]取出第一个元素的地址,+1偏移1个地址,计算b-f的长度 5

 

char* p = "abcdef";

printf("%d\n", strlen(p));                     // 6

求字符串长度

printf("%d\n", strlen(p + 1));              // 5

p + 1是b的地址,求字符串长度就是5

printf("%d\n", strlen(*p));                  // err

*p是'a'

printf("%d\n", strlen(p[0]));              // err

同上一个

printf("%d\n", strlen(&p));                // 随机值

&p拿到的是p这个指针变量的起始地址,从这里开始求字符串长度完全是随机值

printf("%d\n", strlen(&p + 1));          // 随机值

&p+1是跳过p变量的地址,从这里开始求字符串长度也是随机值

printf("%d\n", strlen(&p[0] + 1));     // 5  

&p[0] + 1是b的地址,从b的地址向后数字符串的长度是5

printf("%d\n", sizeof(p));                 // 4/8         

p是指针变量,大小就是4/8字节

printf("%d\n", sizeof(p + 1));          // 4/8

p + 1是b的地址,是地址,就是4/8个字节

printf("%d\n", sizeof(*p));              // 1

*p是'a',sizeof(*p)计算的是字符的大小,是1字节

printf("%d\n", sizeof(p[0]));           // 1

p[0]-->*(p+0) --> *p 就同上一个,1字节

printf("%d\n", sizeof(&p));            // 4/8

&p是二级指针,是指针大小就是4/8

printf("%d\n", sizeof(&p + 1));     // 4/8

&p + 1是跳过p变量后的地址,4/8字节

printf("%d\n", sizeof(&p[0] + 1));      //4/8

p[0]就是‘a’,&p[0]就是a的地址,+1,就是b的地址,是地址就是4/8

四.二维数组 

int a[3][4] = {0};
printf("%d\n",sizeof(a));                    // 12*4=48 
sizeof(数组名)表示计算整个数组的大小
printf("%d\n",sizeof(a[0][0]));          // 4
a[0][0]表示第一行第一个元素的大小,元素是int型的,4字节
printf("%d\n",sizeof(a[0]));              // 16
sizeof(a[0])表示计算数组a[0]的大小,为4*4=16
printf("%d\n",sizeof(a[0]+1));           // 4/8
a[0]没有单独放在sizeof内部,表示数组a[0]首元素地址,即a[0][0]的地址,+1表示a[0][1]的地址,地址 4/8字节
printf("%d\n",sizeof(*(a[0]+1)));         // 4
其实就是对上题加一个解引用,求的是a[0][1]的大小是 4字节
printf("%d\n",sizeof(a+1));                 // 4/8
a表示数组a的首地址,即第一行的地址,+1表示第二行的地址,地址4/8字节
printf("%d\n",sizeof(*(a+1)));             // 16
对上题加一个解引用,即求第二行的大小,即4*4=16字节
printf("%d\n",sizeof(&a[0]+1));          // 4/8
&a[0]表示第一行的地址,+1表示第二行的地址,地址是4/8字节
printf("%d\n",sizeof(*(&a[0]+1)));      // 16
对上题加一个解引用,表示第二行的大小,即4*4=16字节
printf("%d\n",sizeof(*a));                    // 16
a表示数组a的首地址,即第一行的地址, 对地址解引用 求第一行的大小 4*4=16
printf("%d\n",sizeof(a[3]));                 // ?
sizeof(a[3])表示计算数组a[3]的大小,即便a[3]不在数组范围内,但不构成非法访问,正常计算,但我们不知道第四行是什么东西,所以不得解

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JJY_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值