sizeof考题

转自yingxunren

1.常规
char str1[] = “Hello” ;
char str2[5] = {'H','e','l','l','o'};
char str3[6] = {'H','e','l','l','o','/0'};
char   *p1 = "Hello";
char *p2[]={"hello","world"}; 
int     n = 10;
int    *q = &n;

sizeof (str1 ) = 6    (自动加了'/0')  
strlen (str1 ) = 5    (字符串的长度)  
sizeof (str2 ) = 5     (字符数组的大小)
strlen (str2) = 未知 (该字符串缺少结束符'/0')
sizeof (str3) = 6     (字符数组的大小)
strlen (str3) = 5    (该字符串的长度为5)
sizeof ( p1 ) =   4    (p1是一个指针,大小为4)
sizeof ( p2 ) =   8    (p2是长度为2的字符串数组)
sizeof ( n ) =   4    (整型大小为4)
sizeof ( q ) =   4    (q是一个指针,大小为4)

2.动态分配内存
int *p = (int *)malloc( 100 );
sizeof ( p ) = 4      (p是一个指针,大小为4)

3.函数参数
void Function1( char p[],int num ){
    sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}
void Function2( int p[],int num ){
    sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}

4.多重继承
class A{};
class B{};
class C:public A,public B{};
class D:virtual public A{};
class E:virtual public A,virtual public B{};
sizeof ( A ) = 1      (空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象)
sizeof ( B ) = 1      (空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象)
sizeof ( C ) = 1      (继承或多重继承后空类大小还是1)
sizeof ( D ) = 4      (虚继承时编译器为该类安插一个指向父类的指针,指针大小为4
sizeof ( E ) = 8      (指向父类A的指针与父类B的指针,加起来大小为8)

5.数据对齐
类(或结构)的大小必需为类中最大数据类型的整数倍.CPU访问对齐的数据的效率是最高的,因此通常编译浪费一些空间来使得我们的数据是对齐的
class A{
public:
    int a;
};
class B{
public:
     int a ;
    char b;
};
class C{
public:
     int a ;
    char b;
    char c;
};
sizeof(A) = 4 (内含一个int ,所以大小为4)
sizeof(B) = 8    (int为4,char为1,和为5,考虑到对齐,总大小为int的整数倍即8)  
sizeof(C) = 8   (同上)

6.函数与虚函数
编译器为每个有虚函数的类都建立一个虚函数表(其大小不计算在类中),并为这个类安插一个指向虚函数表的指针,即每个有虚函数的类其大小至少为一个指针的大小4
class A{
public:
    int a;
    void Function();
};
class B{
public:
    int a;
    virtual void Function();
};
class C:public B{
public:
    char b;
};
class D:public B{
public:
    virtual void Function2();
};
class E{
public:
    static void Function();
};
sizeof (A) = 4   (内含一个int,普通函数不占大小)
sizeof (B) = 8   (一个int ,一个虚函数表指针)
sizeof (C) =12   (一个int ,一个虚函数表指针,一个char ,再加上数据对齐)
sizeof (D) = 8   (一个int ,一个虚函数表指针,多个虚函数是放在一个表里的,所以虚函数表指针只要一个就行了)
sizeof (E) = 1   (static 函数不占大小,空类大小为1)

7.父类的私有数据
虽然在子类中不可用,但是是可见的,因此私有的数据还是要占子类的大小
class A{
private:
    int a;
};
class B:public A{};
sizof(B) = 4;    (内含一个不可用的父类的int)
8.大概就这么多了吧,想到再加吧。虚函数,多重继承,空类是比较复杂的,大家大概记住知道就行了

 

补充:

class static_D
{
int static intVar;
   static void fun(){}

};

sizeof(static_D) ==1 //静态数据成员不计入类内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以回答这个问题。以下是一个简单的单项选择题标准化考试的C语言程序: #include <stdio.h> int main() { int score = ; // 记录分数 char answer; // 记录答案 // 第一题 printf("1. C语言中,下列哪个关键字用于定义常量?\n"); printf("A. const\nB. static\nC. volatile\nD. extern\n"); printf("请输入你的答案(A/B/C/D):"); scanf("%c", &answer); if (answer == 'A' || answer == 'a') { score += 10; } // 第二题 printf("2. 下列哪个函数用于输出字符?\n"); printf("A. printf\nB. scanf\nC. getchar\nD. putchar\n"); printf("请输入你的答案(A/B/C/D):"); scanf(" %c", &answer); // 注意加一个空格,避免读取上一个输入的回车符 if (answer == 'D' || answer == 'd') { score += 10; } // 第三题 printf("3. 下列哪个运算符用于取地址?\n"); printf("A. &\nB. *\nC. /\nD. %\n"); printf("请输入你的答案(A/B/C/D):"); scanf(" %c", &answer); if (answer == 'A' || answer == 'a') { score += 10; } // 输出分数 printf("你的得分是:%d\n", score); return ; } 希望这个程序能够帮到你! ### 回答2: 当然可以帮您写一个单项选择题标准化考试的C语言程序。下面是一个简单的示例程序: ```c #include <stdio.h> int main() { // 定义题目数组 char questions[][100] = { "1. C语言是一种什么类型的计算机编程语言?", "2. 下列选项中,不属于C语言基本数据类型的是:", // 添加更多题目... }; // 定义选项数组 char options[][4][100] = { {"A. 高级语言", "B. 低级语言", "C. 中级语言", "D. 汇编语言"}, {"A. int", "B. char", "C. float", "D. string"}, // 添加更多选项... }; // 定义正确答案数组 char answers[] = {'A', 'D'}; // 定义用户答案数组 char userAnswers[100]; int totalQuestions = sizeof(questions) / sizeof(questions[0]); int score = 0; printf("欢迎参加单项选择题标准化考试!\n"); // 循环显示问题并获取用户答案 for (int i = 0; i < totalQuestions; i++) { printf("\n%s\n", questions[i]); for (int j = 0; j < 4; j++) { printf("%s\n", options[i][j]); } printf("请输入您选择的答案(A, B, C, D):"); scanf(" %c", &userAnswers[i]); if (userAnswers[i] == answers[i]) { score++; // 回答正确,得分加一 } } printf("\n考试结束!您的得分是:%d/%d\n", score, totalQuestions); return 0; } ``` 上述程序使用了两个二维字符数组来存储题目和选项,使用一个字符数组来存储正确答案。程序会逐个显示问题,并要求用户输入答案。在用户回答完所有问题后,程序会计算得分并显示在屏幕上。 请注意,该程序只是一个简单示例,仅包含两个问题。如果需要添加更多问题,可以根据示例中的格式进行修改和扩展。 ### 回答3: 下面是一个用C语言编写的标准化考试的单项选择题程序的示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_QUESTIONS 10 // 定义题目结构体 typedef struct { char question[100]; char options[4][50]; int correctOption; } Question; // 初始化题库 void initializeQuestions(Question *questions) { strcpy(questions[0].question, "What is the capital of France?"); strcpy(questions[0].options[0], "A. Paris"); strcpy(questions[0].options[1], "B. London"); strcpy(questions[0].options[2], "C. Madrid"); strcpy(questions[0].options[3], "D. Rome"); questions[0].correctOption = 0; // 添加更多题目... } // 显示题目并获取用户答案 int displayQuestionAndGetAnswer(Question question) { int answer; printf("%s\n", question.question); for (int i = 0; i < 4; i++) { printf("%s\n", question.options[i]); } printf("Please enter your answer (A/B/C/D): "); char userAnswer; scanf(" %c", &userAnswer); switch (userAnswer) { case 'A': case 'a': answer = 0; break; case 'B': case 'b': answer = 1; break; case 'C': case 'c': answer = 2; break; case 'D': case 'd': answer = 3; break; default: answer = -1; break; } return answer; } // 计算并显示考试结果 void displayResult(int *userAnswers, Question *questions, int numQuestions) { int score = 0; printf("\n----- Exam Results -----\n"); for (int i = 0; i < numQuestions; i++) { if (userAnswers[i] == questions[i].correctOption) { score++; } printf("Question %d: %s\nYour Answer: %s\nCorrect Answer: %s\n\n", i+1, questions[i].question, questions[i].options[userAnswers[i]], questions[i].options[questions[i].correctOption]); } printf("Score: %d/%d\n", score, numQuestions); } int main() { Question questions[MAX_QUESTIONS]; int userAnswers[MAX_QUESTIONS]; int numQuestions = 3; // 题库中的题目数量 initializeQuestions(questions); // 获取用户答案 for (int i = 0; i < numQuestions; i++) { printf("\nQuestion %d:\n", i+1); userAnswers[i] = displayQuestionAndGetAnswer(questions[i]); } // 显示考试结果 displayResult(userAnswers, questions, numQuestions); return 0; } ``` 这个程序使用了题目结构体来存储题目和选项的信息。`initializeQuestions`函数用于初始化题库中的题目,你可以根据需要添加更多的题目。`displayQuestionAndGetAnswer`函数用于显示题目并获取用户答案。最后,`displayResult`函数用于计算和显示考试结果。 在`main`函数中,我们首先调用`initializeQuestions`来初始化题库,然后通过循环调用`displayQuestionAndGetAnswer`函数获取用户的答案,并将答案存储在`userAnswers`数组中。最后,我们调用`displayResult`函数来计算和显示考试结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值