1. 程式人生 > >c、c++ 基礎試題(1)

c、c++ 基礎試題(1)

1、以下程式的輸出結果是什麼?

main()
{
    char *p1 = "name";
    char *p2;
    p2 = (char*)malloc(20);
    memset(p2, 0, 20);
    while(*p2++ = *p1++);
    printf("%s",p2);
}

2、以下程式的輸出結果是什麼?

main()
{
    int x = 20, y = 35; 
    x = y++ + x++; 
    y = ++y + ++x; 
    printf("%d,%d",x,y);
}
main()
{
    
int arr[] = {6, 7, 8, 9, 10}; int *ptr = arr; *(ptr++) += 123; printf("%d, %d", *ptr, *(++ptr)); }

3、以下程式的輸出結果是什麼?

main() 
{ 
    int x = 5; 
    printf("%d,%d,%d",x,x<<2,x>>2); 
}

4、以下程式的輸出結果是什麼?

main()
{ 
    char *ptr = " Cisco Systems";
    *ptr++; printf("
%s", ptr); ptr++; printf("%s",ptr); }

5、以下程式的輸出結果是什麼?

main()
{ 
    char s1[] = "Cisco"; 
    char s2[] = "systems"; 
    printf("%s", s1); 
}

6、以下程式的輸出結果是什麼?

main()
{ 
    char *p1; 
    char *p2; 
    p1 = (char *)malloc(25); 
    p2 = (char *)malloc(25); 

    strcpy(p1, 
"Cisco"); strcpy(p2, "systems"); strcat(p1, p2); printf("%s", p1); }

7、以下程式的輸出結果是什麼?

main()
{ 
    int x = 10, y = 15; 
    x = x++; 
    y = ++y; 
    printf("%d %d",x,y); 
}
main()
{
    int a,b,c,d;
    a=10;
    b=a++;
    c=++a;
    d=10*a++;
    printf("b,c,d:%d,%d,%d",b,c,d);
    return 0;
}

8、以下程式的輸出結果是什麼?

#include <stdio.h>
#include <iostream.h>

struct bit 
{
   int a:3; 
   int b:2; 
   int c:3; 
};
 
int main(int argc, char* argv[]) 
{ 
   bit s; 
   char *c = (char*)&s; 
   *c = 0x99; 
   cout << s.a << s.b << s.c;
   return 0; 
} 

9、以下程式的輸出結果是什麼?

#include <iostream>
using namespace std;

int main()
{
    int num[5] = {1,2,3,4,5};
    cout<<*((int *)(&num+1)-2)<<endl;

    return 0;
}

10、以下程式的輸出結果是什麼?

main()
{
   struct node 
   {
       int a;
       int b;
       int c;     
   };
   struct node s= {3, 5, 6};
   struct node *pt = &s;
   printf("%d", *(int*)pt);
}

11、以下程式的輸出結果是什麼?

main() 
{
    int a[5] = {1, 2, 3, 4, 5};
    int *ptr = (int*)(&a+1);
    
    printf("%d %d" , *(a+1), *(ptr-1));
}

12、以下程式的輸出結果是什麼?

void foo(int [][3]);     

main()
{
    int a[3][3]= {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    foo(a);
    printf("%d", a[2][1]);
}

void foo(int b[][3])   
{
    ++ b;
    b[1][1] =9;
}

13、以下程式的輸出結果是什麼?

main()
{
    int a, b,c, d;
    
    a=3;
    b=5;
    c=a,b;
    d=(a,b);

    printf("c=%d", c);
    printf("d=%d", d);
}

14、以下程式的輸出結果是什麼?

main()
{
    int a[][3] = {1, 2, 3, 4, 5, 6};
    int (*ptr)[3] = a;

    printf("%d %d", (*ptr)[1], (*ptr)[2]);

    ++ptr;
    printf("%d %d", (*ptr)[1], (*ptr)[2]);
}

15、以下程式的輸出結果是什麼?

main()
{
    int i=3;
    int j;  

    j = sizeof(++i+++i);
    
    printf("i=%d j=%d", i, j);
}
main()
{
    int **a[3][4];

    printf("%d", sizeof(a));
}

16、以下程式的輸出結果是什麼?

void e(int);   

main()
{
    int a;
    a = 3;
    e(a);
}

void e(int n)
{
    if(n > 0)
    {
        e(--n);
        printf("%d", n);
        e(--n);
    }
}

17、以下程式的輸出結果是什麼?

void f(char**);

main()
{
    char * argv[] = {"ab", "cd", "ef", "gh", "ij", "kl"};
    f(argv);
}

void f(char **p)
{
    char *t;

    t = (p += sizeof(int))[-1];
   
    printf("%s", t);
}

18、以下程式的輸出結果是什麼?

#include <iostream>
using namespace std;

struct s1
{
    char a;
    double b;
    int c;
    char d; 
};

struct s2
{
    char a;
    char b;
    int c;
    double d;
};

int main()
{
    cout<<sizeof(double)<<endl; // 8
    cout<<sizeof(s1)<<endl;
    cout<<sizeof(s2)<<endl;
}

19、以下程式的輸出結果是什麼?

#include <stdio.h>

int main()
{
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
}

20、以下程式的輸出結果是什麼?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *ptr;

    if ((ptr = (char *)malloc(0)) == NULL) 
        puts("Got a null pointer");
    else
        puts("Got a valid pointer");
}

21、32位系統下,以下程式的輸出結果是什麼?

#include <stdio.h>
#include <stdlib.h>

void func(char str[100])
{
    printf("%d", sizeof(str));
}

int main()
{
    char str[] = "Hello" ;
    char *p = str ;
    int n = 10;
    void *q = malloc(100);
    
    printf("%d %d %d %d\n", sizeof(str), sizeof(p), sizeof(n), sizeof(q));
    func(str);
}

22、以下程式的輸出結果是什麼?

#include <stdio.h> 

int inc(int a)
{
    return (++a);
}

int multi(int *a, int *b, int *c)
{
    return(*c = *a * *b);
} 

typedef int(FUNC1)(int);
typedef int(FUNC2)(int*, int*, int*);

void show(FUNC2 fun, int arg1, int *arg2)
{
    FUNC1 p = &inc;
    int temp = p(arg1);
    fun(&temp, &arg1, arg2);

    printf("%d\n", *arg2);
}

main()
{
    int a;
    show(multi, 10, &a); 
    return 0; 
}

23、變數的宣告和定義有什麼區別?

宣告一個變數、函式甚至是類時,是在告訴編譯器存在一個這種名字的東西,並且擁有型別。然後編譯器就可以做很多事情,而不需要把這個名字的詳細定義。當工作於一個多原始檔系統,在多個檔案中使用函式時,這個特別有用。你不需要在多個檔案中都放入函式體,只需要提供對它的宣告。

宣告的例子:

extern int x;
extern short *count;
extern char *live[MAX_COUNT];
extern enum emreg rclass[REGS];
extern struct gfile *gfiles;
extern opta add_opta;
extern tree build(), retrieve(), destroy();
int push_operand ();
int gene_operand ();
class CDoneCap;

  

24、sizeof和strlen的區別?

(1) sizeof是一個操作符,strlen是庫函式;
(2) sizeof的引數可以是資料的型別,也可以是變數,而strlen只能以結尾為‘\0‘的字串作引數;
(3) 編譯器在編譯時就計算出了sizeof的結果。而strlen 函式必須在執行時才能計算出來。並且sizeof計算的是資料型別佔記憶體的大小,而strlen計算的是字串實際的長度;
(4) 陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。

25、簡述C、C++程式編譯的記憶體分配情況

C、C++中記憶體分配方式可以分為三種:
(1) 從靜態儲存區域分配:
記憶體在程式編譯時就已經分配好,這塊記憶體在程式的整個執行期間都存在。速度快、不容易出錯,因為有系統會善後。例如全域性變數,static變數等。
(2) 在棧上分配:
在執行函式時,函式內區域性變數的儲存單元都在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
(3) 從堆上分配:
即動態記憶體分配。程式在執行的時候用malloc或new申請任意大小的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活。如果在堆上分配了空間,就有責任回收它,否則執行的程式會出現記憶體洩漏,另外頻繁地分配和釋放不同大小的堆空間將會產生
堆內碎塊。
一個C、C++程式編譯時記憶體分為5大儲存區:堆區、棧區、全域性區、文字常量區、程式程式碼區。

26、設定地址為0x12ff7c的整型變數的值為0xaa66

int main()
{
    int *ptr;  
    ptr = (int *)0x12ff7c;
    *ptr = 0xaa66;
}

27、用變數a給出下面的定義

a) 一個整型數(An integer)
b) 一個指向整型數的指標(A pointer to an integer)
c) 一個指向指標的的指標,它指向的指標是指向一個整型數(A pointer to a pointer to an integer)
d) 一個有10個整型數的陣列(An array of 10 integers)
e) 一個有10個指標的陣列,該指標是指向一個整型數的。(An array of 10 pointers to integers)
f) 一個指向有10個整型數陣列的指標(A pointer to an array of 10 integers)
g) 一個指向函式的指標,該函式有一個整型引數並返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一個有10個指標的陣列,該指標指向一個函式,該函式有一個整型引數並返回一個整型數(An array of ten pointers to functions that take an integer argument and return an integer)

28、評價下面的程式碼片段

#include <stdio.h>

int main()
{
    unsigned int zero = 0;
    unsigned int compzero = 0xFFFF;
}

29、以下是定義dPS 和 tPS 作為一個指向結構s的指標,哪種方法更好?(如果有的話)為什麼?

#define dPS struct s *
typedef struct s * tPS;

30、置位和清位

#include <stdio.h>

#define BIT5 (0x1 << 5)

int main()
{
    int a;

    a |= BIT5;
    a &= ~BIT5;
}

31、寫一個C函式,若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1

#include <stdio.h>

int checkCPU()
{
    {
        union w
        {
            int  a;
            char b;
        } c;
        c.a = 1;
        return(c.b == 1);
    }
}

int main()
{
    printf("%s\n", checkCPU() ? "Little_endian" : "Big_endian");
}

32、在C++程式中呼叫被 C編譯器編譯後的函式,為什麼要加 extern “C”?

答:C++語言支援函式過載,C語言不支援函式過載。函式和變數被C++編譯後在符號庫中的名字與C語言的不同,被extern "C"修飾的變數和函式是按照C語言方式編譯和連線的。由於編譯後的名字不同,C++程式不能直接呼叫C 函式。C++提供了一個C 連線交換指定符號extern“C”來解決這個問題。假設某個函式的原型為: void foo(int x, int y); 該函式被C編譯器編譯後在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。

33、以下各程式是否存在問題,如果有,是哪些?

void GetMemory(char *p)
{
    p = (char *)malloc(100);
}

void Test(void) 
{
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
}
char *GetMemory(void)
{ 
    char p[] = "hello world";
    return p;
}

void Test(void)
{
    char *str = NULL;
    str = GetMemory(); 
    printf(str);
}
void GetMemory2(char **p, int num)
{
    *p = (char *)malloc(num);
}

void Test(void)
{
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello"); 
    printf(str); 
}
void Test(void)
{
    char *str = (char *) malloc(100);
    strcpy(str, "hello");
    free(str); 
    if(str != NULL)
    {
        strcpy(str, "world"); 
        printf(str);
    }
}

34、請找出下面程式碼中的所有錯誤

說明:以下程式碼是把一個字串倒序,如“abcd”倒序後變為“dcba”

#include "string.h" 

void main() 
{  
    char *src = "hello,world"; 
    char *dest = NULL; 

    int len = strlen(src);  
    dest = (char*)malloc(len);

    char *d = dest; 
    char *s = src[len]; 
    while(len-- != 0) 
        d++ = s--;  

    printf("%s",dest); 
} 

35、下述三個有什麼區別? 

char * const p;
char const * p;
const char *p;

36、以下程式碼的輸出結果是什麼?

#include <iostream.h>

void main() 
{  
    char str1[] = "abc"; 
    char str2[] = "abc";  
    const char str3[] = "abc"; 
    const char str4[] = "abc"; 
    const char *str5 = "abc"; 
    const char *str6 = "abc"; 
    char *str7 = "abc"; 
    char *str8 = "abc";  
    
    cout << (str1 == str2) << endl; 
    cout << (str3 == str4) << endl; 
    cout << (str5 == str6) << endl; 
    cout << (str7 == str8) << endl; 
} 

37、以下程式碼有什麼錯?

#include <stdio.h>

void main() 
{  
    char* s = "AAA";
    printf("%s", s);

    s[0] = 'B';
    printf("%s", s);
} 

以下兩題誰對誰錯?

main()
{
    char s[] = "abc";
    Reverse(s);
    printf("%s", s);
}

main()
{
    char *s = "abc";
    Reverse(s);
    printf("%s", s);
}

38、實現字串拷貝函式char *strcpy(char *dest,char *src)

extern char *strcpy(char *dest, char *src); 
{  
    ASSERT((dest!=NULL)&&(src!=NULL)); 
    char *address = dest;  
    While((*dest++ = *src++) != '\0') 
        continue;
    return dest; 
}

39、實現字串比較函式int strcmp(char *source, char *dest),相等返回0,不等返回-1;

int strcmp(char *source, char *dest)
{
    assert((source!=NULL)&&(dest!=NULL));
    int i,j;
    for(i=0; source[i]==dest[i]; i++)
    {
        if(source[i]=='\0' && dest[i]=='\0')
            return 0;
        else
            return -1;
    }
}
int strcmp(char *source, char *dest)
{
    while ( (*source != '\0') && (*source == *dest))
    {
        source++;
        dest++;
    }
    return ( (*source) - (*dest) ) ? -1 : 0;
}

40、實現記憶體拷貝函式void *memcpy(void *dest, void *src, unsigned int count)

extern void *memcpy(void *dest, void *src, unsigned int count)
{  
    ASSERT((dest != NULL) && (src != NULL));  
    ASSERT((dest > src + count) || (src > dest + count));//防止記憶體重疊 
    
    byte *bdest = (byte*)dest; 
    byte *bsrc = (byte*)src; 
    While(count-- > 0) 
        *bdest++ = *bsrc++; 
    return dest;
}

41、實現字串連線函式char *strcat (char *strDest, const char *strSrc)

char * __cdecl strcat (char * dst, const char * src)
{
    char * cp = dst;
    while( *cp )
        cp++; /* find end of dst */
    while( *cp++ = *src++ ) ; /* Copy src to end of dst */
    return( dst ); /* return dst */
}

42、以下程式的執行結果是什麼?

int sum(int a)
{
    auto int c=0;
    static int b=3;
    c+=1;
    b+=2;
    return(a+b+C);
}
  
void main()
{
    int I;
    int a=2;
    for(I=0;I<5;I++)
    {
        printf("%d,", sum(a));
    }
}

43、以下程式的執行結果是什麼?

int func(int a)
{
    int b;
    switch(a)
    {
        case 1: b=30;
        case 2: b=20;
        case 3: b=16;
        default: b=0;
    }
    return b;
}

44、以下程式的輸出結果是什麼?

main()
{
    int a[3] = {0, 1, 2};
    int *p, *q;
    p = a;
    q = &a[2];

    printf("%d", a[q-p]);
}

45、以下程式碼的輸出結果是什麼?

main()
{
    unsigned short A = 10;
    printf("~A = %u\n", ~A);

    char c=128;
    printf("c = %d\n",c);
}

46、已知

unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;

請問
p1 + 5 = ______;
p2 + 5 = ______;

47、以下3個函式中最可能引起指標方面的問題是哪幾個?

int *f1(void)
{
    int x =10;
    return(&x);
}

int *f2(void)
{
    int*ptr;
    *ptr =10;
    return ptr;
}

int *f3(void)
{
    int *ptr;
    ptr=(int*) malloc(sizeof(int));
    return ptr;
}

相關推薦

cc++ 基礎試題1

1、以下程式的輸出結果是什麼? main() { char *p1 = "name"; char *p2; p2 = (char*)malloc(20); memset(p2, 0, 20); while(*p2++ = *p1++); pr

Java基礎工具1_常用類——用戶和程序交互

size 數據 輸入 方法 main方法 main scanner類 style 輸入數據 2018-05-12 用戶和程序交互 程序接受用戶的輸入數據,有以下三種方式 一、main方法接受參數 二、Console 三、Scanner類 三、Java基

Java基礎工具1_常用類——數學相關類

ref .com 工具 www 小數 spa -- 指數 target 2018-05-13 數學相關類 一、Math類    Java 的 Math 包含了用於執行基本數學運算的屬性和方法,如初等指數、對數、平方根和三角函數。   Math 的方法都被定義為 s

Java基礎工具1_常用類——日期類

for 我們 size CA calendar 大量 col -- bsp 2018-05-14 日期類 一、Date類   講java.util.Date,類 Date 表示特定的瞬間,精確到毫秒。   Date類中大量方法讀已經過時,過時不代表不存在,依然可以

cc++ 基礎試題2

#include <stdio.h> int main() { char c; FILE *file; file = fopen("test.txt", "w+"); fprintf(file, "%c", 'a'); fprintf

cc++ 基礎試題3

#include <stdio.h> struct s1 { int a : 1; int b : 1; }; struct s2 { int a : 20; int b : 12; }; struct s3 { i

c++ 部分基礎知識 ---- 1

知識 gin href com cin http targe 基礎知識 ucs 灰dtj4慚fv腺伎孕6xnhttp://www.docin.com/app/user/userinfo?userid=179253887 傅zpf攣詿4隊餵皇影http://www.doci

C++基礎概念1

名稱空間 名稱空間定義 在C/C++中,變數、函式和後面要學到的類都是大量存在的,這些變數、函式和類的名稱將都存在於全域性作 用域中,可能會導致很多衝突。使用名稱空間的目的是對識別符號的名稱進行本地化,以避免命名衝突或名字 汙染,namespace關鍵字的出現就是針對這種問題的。 定

c++實現二叉樹及筆試題1

1.建立二叉樹2.前序遍歷<遞迴與非遞迴> 3.中序遍歷<遞迴與非遞迴> 4.後序遍歷<遞迴與非遞迴> 5.層次遍歷  6.獲得節點葉子的個數7.二叉樹獲得的高度8.二叉樹交換的左右兒子9.求兩個節點pNode1和pNode2在以[R為樹

Objective-C基礎筆記1基本概念和第一個程式

一、基本概念Objective-C(簡稱OC)是iOS開發的核心語言,蘋果公司在維護,在開發過程中也會配合著使用C語言、C++,OC主要負責UI介面,C語言、C++可用於圖形處理。C語言是面向過程的語言,OC是在C語言基礎上加上了一層面向物件的語法(將複雜面向物件語法去掉了)

c/c++基礎1

下面關於typedef char String_t; 和#define String_d char 這兩句在使用上的區別描述錯誤的是? A、typedef char *String_t 定義了一個新的類型別名,有型別檢查 B、#define String_

iOS 面試題1:一個 Objective-C 物件的記憶體結構是怎樣的?

接下來分享的將會是唐老師一系列的iOS面試題,因為之前好幾期唐老師都刪掉了,說是要出書,所以轉載過來,需要的朋友們可以看下,也方便我自己鞏固、學習。 轉載自:http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=

嵌入式筆試面試題1---C++

C++的類的繼承與多型1、是不是一個父類寫了一個virtual 函式,如果子類覆蓋它的函式不加virtual ,也能實現多型? 能2、構造、拷貝構造和賦值運算子的概念3、struct C{C(){cout << "construct: C()" <<

C#系列之基礎知識點

命名規則 系列 字符 註釋 編輯器 小數類型 智能 規則 解釋 知識點一:VS啟動方法 第一種:雙擊圖標 第二種:window+R——調出cmd,輸入devenu properties 屬性的意思 知識點二:後綴名解釋 .sln 解決方案文件:包含整個解決方案的信息 .

C++11 右值引用1

先參考上一節  C++11 左值 右值 ,本節是右值引用的基礎及判斷方法。 一 右值引用 C++11新增的右值引用概念,用&&表示。 二 引用型別 引用型別 可以引用的值類別 備註

JAVA基礎試題1

1、所有的類都繼承於Object類,其直接子類有Boolean 、void 、Character、Class、Compiler、Math、Number、Runtime、StringBuffer、StringBuilder、System、Thread等等;其常用的方法有:toString()、&nbs

C語言之指標筆記1

指標(pointer)是C語言中最重要的概念之一,用於儲存變數的地址。 1.&運算子 (1)一元&運算子可給出變數的儲存地址。如過pooh是變數名,那麼&pooh是變數地址。 (2)如下例所示,使用運算子檢視不同函式中的同名變數儲存在什麼位置。 原始碼: //檢視

C++個別資料型別使用1

set:不允許有兩個一樣的鍵值,他會根據鍵值自動排序 set.insert   插入某個鍵值 set.count()  判斷某元素是否在set中 vector vector.end  指向向量最後一個元素的下一個位置 vector.push_bac

【機器人學的數學基礎1李群李代數和螺旋運動

剛體變換/3維空間中的旋轉運動/3維空間中的剛體運動 這篇文章的內容來源於《A Mathematical Introduction to Robotic Manipulation》。 一、重要數學符號的含義 首先介紹若干符號及含義,一些同學可能已經知道旋轉矩陣和齊次變換矩陣的

C++11多執行緒1

        C++11中添加了duox多執行緒類,編寫C++程式可以直接使用C++11中的多執行緒庫,不必依賴於平臺多執行緒,這樣可以方便寫出誇平臺的多執行緒程式。多執行緒可以最大化利用計算機資源,提高程式碼的執行效率。         C++11中thread類提供兩