13. C语言&数据结构与算法(99道)***2***

2.数据类型(22道)

2.1 用变量a给出下面的定义 

(1)一个整型数: int a。
(2)一个指向整型数的指针(一重指针): int *a。
(3)一个指向指针的的指针,它指向的指针是指向一个整型数的指针(二重指针): int **a。
(4)一个有10个整型数的数组 :int a[10]。
(5)一个有10个指针的数组,这10个指针是指向整型数的(指针数组): int *a[10]。
(6)一个指向有10个整型数数组的指针(数组指针):int (*a)[10]。
(7)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(函数指针):int (*a)(int)。
(8)一个有10个指针的数组,这10个指针均指向函数,该函数有一个整型参数并返回一     个整型数(函数指针数组): int (*a[10])(int)。


2.2下面的代码输出是什么,为什么? 

void foo(void)   
{   
    unsigned int a = 6;   
    int b = -20;   
    (a + b > 6)? printf("> 6") : printf(" <= 6");   
}   

答案:输出是 “>6”

解读:当运算表达式中存在有符号数和无符号数时,有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数)。注意,正数的补码为其本身,负数的补码为其反码+1。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果 ”>6”


2.3写出float x与“零值”比较的if语句。
答案:
if(x > -0.000001 && x < 0.000001);  

解读:因为计算机在处理浮点数的时候是有误差的,所以不能将浮点型变量用“==”或“!=”与数字比较,应该设法转化成“>”或“<”此类形式。


2.4下面代码有什么错误?

#include<stdio.h>  
void main()  
{  
    char *s = "AAA";  
    s[0] = 'B';  
    printf("%s", s);  
}  
(1)"AAA"是字符串常量,s是指针,指向这个字符串常量,所以声明s的时候就有问题,应该是const char* s="AAA"。
(2)然后又因为是常量,所以对是s[0]的赋值操作是不合法的。


2.5下面代码输出是什么?

#include<stdio.h>  
void main()  
{  
    int *a = (int *)2;  
    printf("%d", a + 3);   
}  

答案:输出是14。

解读:代码将数值2强制类型转换为int类型指针,int类型指针加3 相当于指向后面第三个int类型变量的首地址,一个int类型变量占4个字节,所以加3相当于指针往后移了12个字节,指向地址14处。


2.6下面代码运行后会是什么现象?

#include<stdio.h>  
#define N 500  
void main()  
{  
    unsigned char count;  
    for(count = 0; count < N; count++)  
    {  
        printf("---%d---\n", count);  
    }  
} 

答案:进入不断打印count值的死循环。

解读:因为unsigned char 类型变量的最大值为255,所以count只能从0一直增加到255,然后又恢复为0,无法退出for循环。


2.7下面函数的返回值是?

int foo(void)  
{  
    int i;  
    char c = 0x80;   
    i = c;  
    if(i > 0)  
        return 1;  
    return 2;  
}  

答案:返回值为2。

解读:因为0x80 == 128,超出了char类型变量c的表示范围(-128~127),所以c == -128,进而i == -128,i < 0。


2.8结构体内存对齐原则?

答案:

(1)第一个成员的首地址(地址偏移量)为0。

(2)成员对齐:以4字节对齐为例,如果自身类型小于4字节,则该成员的首地址是自身类型大小的整数倍;如果自身类型大于等于4字节,则该成员的首地址是4的整数倍。若内嵌结构体,则内嵌结构体的首地址也要对齐,只不过自身类型大小用内嵌结构体的最大成员类型大小来表示。数组可以拆开看做n个数组元素,不用整体看作一个类型。

(3)最后结构体总体补齐:以4字节对齐为例,如果结构体中最大成员类型小于4字节,则大小补齐为结构体中最大成员类型大小的整数倍;如果大于等于4字节,则大小补齐为4的整数倍。内嵌结构体也要补齐。

注意:32位编译器,一般默认对齐方式是4字节。


2.9

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

包含241道笔试面试真题详解,还有岗位及校招介绍,简历制作、笔试准备、面试准备的经验分享,以及嵌入式软件工程师技能树解读。你想知道的所有关于嵌入式求职的问题,几乎都可以在这里找到答案。 订阅即赠送学习笔记、简历模板、面试提纲模板、内推机会,需要的同学点击我头像私信即可!

全部评论
2.4(1)中的const写成cosnt了
点赞
送花
回复
分享
发布于 2022-09-06 13:50 山东
字符数组不能存放字符串吗,char str[]={“aaaaa”};这样没问题呀
点赞
送花
回复
分享
发布于 2021-02-27 00:00
滴滴
校招火热招聘中
官网直投
想问一下,c文件中能包涵c文件吗
点赞
送花
回复
分享
发布于 2021-04-20 22:31
2.5下面代码输出是什么? 1 2 3 4 5 6 #include<stdio.h>   void main()   {       int *a = (int *)2;       printf("%d", a + 3);    }   答案:输出是14。 解读:代码将数值2强制类型转换为int类型指针,int类型指针加3 相当于指向后面第三个int类型变量的首地址,一个int类型变量占4个字节,所以加3相当于指针往后移了12个字节,指向地址14处。 这个能够详细解释一下嘛?对于所以后面的字不太理解,谢谢。
点赞
送花
回复
分享
发布于 2021-07-01 19:13
2.10的结构体有个专门的名字,叫位域,我觉得可以提一下叭~
点赞
送花
回复
分享
发布于 2021-09-15 20:22
安哥 2.15如果要显示5个字符串“gh”的第一个字符,应该怎么写啊😢 除了str[4][0],是不能用t表示是嘛
点赞
送花
回复
分享
发布于 2021-09-15 20:46
2.20那个,指针数组和数组指针是不是写反了啊?感觉有括号的才是指针吧
点赞
送花
回复
分享
发布于 2022-11-24 13:43 重庆
{"pureText":"1.判断字符数组是否为字符串 就得看他末尾有没有'\\0'"}
点赞
送花
回复
分享
发布于 2023-02-01 17:20 河南
结构体总体补齐那边不应该是最大成员的整数倍吗
点赞
送花
回复
分享
发布于 2023-02-09 16:51 广东
2.4 声明的时候不用特意写const char *s = "AAA"; 吧?
点赞
送花
回复
分享
发布于 2023-03-09 00:57 湖南
2.7 i的值应该是0xffffff80吧
点赞
送花
回复
分享
发布于 2023-09-06 08:42 湖南

相关推荐

6 1 评论
分享
牛客网
牛客企业服务