指针理解方面

文章讨论了C语言中指针和地址的相关概念,包括指针的强制类型转换、函数指针的使用、数组与指针的关系以及指针变量的赋值规则。同时,解释了函数声明的含义和调用时的参数传递方式,以及如何定义和使用指针数组。最后,通过一个代码示例展示了do-while和switch-case结构在处理字符串时的行为。
摘要由CSDN通过智能技术生成

1.关于地址和指针,以下叙述正确的是:

      A.可以通过强制类型转换让char型指针指向double类型变量

      B.函数指针p指向一个同类型的函数f的时候,必须写成p=&f

      C.指针p指向一个数组f的时候,必须写成p=&f

      D.一个指针变量p可以指向自身

答案:A  解析:函数指针p指向一个同类型的函数f的时候,可以写成p=f,而不能写成&f, B错误。函数名代表函数的入口地址,指针p指向一个数组f时,可以写成p=f,也可以写成&f,数组名f,可以代表数组的首地址,选项C错误。指针地址指向的是一个地址,是个常量,不能将地址指向另一个地址,选项D错误。char型根据转化原则可以转化为double类型,因此答案是A项。

2.对于函数声明 void fun(float array[],int *ptr);下列叙述正确的是:

          A.调用函数时,array数组的元素和ptr都是按值传送

          B.函数声明有语法错误,参数array缺少数组大小定义

          C.调用函数时,array数组中将存储从实参中复制来的元素值

          D.函数array,ptr都是指针变量

答案:D 解析:(float array[],int *ptr)均表示定义了2个指针变量,*array和ptr,数组名作为函数形参时可以看作指针,所以函数形参中int array[]其实相当于int *array。调用函数时,array元组的元素和ptr都是按地址传送的。答案为D选项

3.设有定义:int x=0,*p; 紧接着的赋值语句正确的是:

   A.*p=NULL;  B.p=NULL;  C.p=x;  D.*p=x;

答案:正确答案B 题目中定义指针变量p,指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。不允许把一个数赋予指针变量,被赋值的指针变量前不能再加“*”说明符。

4.若有说明语句:int *ptr[10];以下叙述正确的是:

A.ptr是一个具有10个指针元素的一维数组,每个元素都只能指向整型变量

B.ptr是指向整型变量的指针

C.ptr是一个指向具有10个整型元素的一维数组的指针

D.ptr是一个指向10个整型变量的函数指针

正确答案:A 解析:int *ptr[10]定义一个指针数组,数组的大小是10,数组中每个元素均是指向整型变量的指针,A正确。ptr是指针数组不是指针,B选项错误。定义指向具有10个整型元素的一维数组的指针格式为:int (*ptr)[10],C选项错误。D选项:函数指针是指向函数的指针,不会指向整型数组。

5.代码如下,则程序的运行结果是()

#include <stdio.h>
int main(){
    char *s="120119110";
    int n0,n1,n2,nn,i;
    n0=n1=n2=nn=i=0;
    do{
        switch(s[i++])
        {
            default : nn++;
            case '0': n0++;
            case '1': n1++;
            case '2': n2++;
        }
       }while(s[i]);
     printf("n0=%d,n1=%d,n2=%d,nn=%d\n",n0,n1,n2,nn);
}

A. n0=3,n1=8,n2=9,nn=1

B.n0=2,n1=5,n2=1,nn=1

C.n0=2,n1=7,n2=10,nn=1

D.n0=4,n1=8,n2=9,nn=1

正确答案:A 解析:本题执行过程为,s[0]='1',匹配case '1',n1=1,n2=1; s[1]=2,匹配case '2',n2=2; s[2]='0',匹配case '0', n0=1, n1=2, n2=3;s[3]='1' ,匹配case '1',n1=3,n2=4……依次类推。大家需要明白switch case函数组合的格式如下:(题目当中正是因为缺少break导致当匹配到某一项的时候,程序无法终止继续执行匹配项的后面的语句,导致会有不相关的值加一的操作)

switch(表达式) { 
    case 值1: 语句1;
        break;
    case 值2: 语句2;
        break; 
    case 值3: 语句3; 
        break; 
        default: 语句4; 
            break; 
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值