1. 程式人生 > >C++ 基礎 (8)

C++ 基礎 (8)

  1. 複習

 

如何呼叫庫函式(別人寫好的函式)

1)       標頭檔案:包含指定的標頭檔案,標頭檔案主要包含此函式的宣告

2)       函式名字:函式名字必須和標頭檔案宣告的名字一樣

 

字串常用處理函式:

 

1.字串輸入 gets() fgets()

 

char buff[100]

gets(buf) //和 scanf的區別是可以有空格

 

// 最多隻能輸入99個

fgets(buf,100,stdin);

 

2.字串的輸出 puts() fputs()

(第一個引數是指標 第二個引數是file,這裡使用標準輸出

 

3.獲取字串長度: strlen (遇到\0就結束 sizeof不會!

 

4.字串拷貝: strcpy(直接拷貝 strncpy(多了一個長度

 

5.字串追加(連線): strcat() strncat()

 

6.格式化輸出字串: printf() sprint()

 

printf(“a = %d\n”,10);

 

“a = 10\n”;

 

sprint(buf,…

// 輸出到字元陣列buf中

 

7.格式化輸入字串 scanf(“%d”,&a)

  char buf[] = “10”

  sscanf(buf,”%d”,&a

 

8.字串查詢(需要使用返回值

strchr()  // 查詢字元

strstr()  // 查詢字串

 

9.字串切割 strtok()

  strtok(buf,”,”) //切割的時候會把原字串破壞

  strtok(NULL,”,”) //第二次切割的時候要把指標指向NULL,才能繼續切割

 

自定義函式

 

02 作業講解

 

03 return和exit區別

 

return的作用,終止函式

1、  return主函式(main),程式結束

2、  return其他函式,程式不結束

 

//puts 和 printf的區別: puts會在結尾新增\n ,printf不會 puts只能輸出字串,而printf卻可以進行標準化的輸出

int I = 10;

printf(“%d”,i)

 

int I = 10;

puts(“%d”,i) //報錯

 

 

 

exit(int )的作用是結束整個程式 //結束程序

相當於把return放到main函式中退出的操作

 

 

4 宣告和定義

實現一個函式,功能和strlen一樣的, int my_strlen(char str[])

(圖中把函式放到main函式後面了)

編譯時候C編譯器會報警告,C++會出錯,所以應該把宣告放到前面

 

 

只要在呼叫的前面宣告就行了,聲明瞭好多次的情況

 

 

5 分檔案(多檔案)程式設計

1、按功能來分 xxx.h xxx.c

2、有一個主函式測試 自定義函式 main.c

 

 

(建立了倆檔案

 

gcc *.c 出現真香警告

 

為了防止警告 應該加入宣告

 

 

 

(這樣就不報錯了

 

想一下 如果我每次要使用都要宣告是不是太麻煩了,

如果有三個.c 那是不是要在三個裡面都重複的寫宣告程式碼

 

於是引入標頭檔案

 

 

 

 

標頭檔案的功能是什麼

 

 

(預處理)

 

結論:多個檔案中,不能出現同名函式(static除外)

 

xxx.c:

   函式的定義

 

xxx.h:

   .c中函式的宣告

 

2、個主函式測試自定義函式 main.c

 

同一個檔案如何防止標頭檔案重複包含(包含多次,只有一次生效):

1、  #pragma once

2、

#ifndef _MYSTRLEN_H

#define _MYSTRLEN_H

 

//函式宣告

 

#endif

 

include的原理: #include "a.h" ,則會把整個 a.h 檔案都copy b.c 的開頭

 

xxx.c:

  函式的定義

  

xxx.h

  .c中函式的宣告

 

1、  有一個主函式測試自定義函式 main.c

 

多個檔案中 不能出現同名函式(static除外

 

同一個檔案如何防止標頭檔案重複包含(包含多次,只有一次生效)

 

1.#pragma once

2.define

 

07 指標概述

 

1、  記憶體,以一個位元組為單位分配記憶體

2、  每個位元組的記憶體都有標號,這個標號就是地址,也叫指標

 

3、  地址需要儲存 32位編譯器用32(4位元組)存此地址 64位編譯器用64(8位元組)存此地址

 

1、  房間分配號碼,記憶體分配標號,編碼

2、  根據房號找到對應的房間,根據地址找到對應的記憶體,定址

 

08 指標補充

 

09 指標的定義和使用

 

 

 

 

 

 

10 指標變數和指標變數所指向的記憶體

 

 

 

 

11 上午知識點複習

 

12 指標練習

 

13 野指標

 

野指標:這個指標變數儲存了一個沒有意義(非法)的地址

 

  1. 只有定義後的變數,此變數的地址才是合法地址
  2. 野指標就是儲存沒有意義地址的指標變數
  3. 操作野指標變數本身不會有任何問題
  4. 操作野指標所指向的記憶體才導致報錯誤

 

 

14 空指標

 

15 指標大小

 

 

 

16 多級指標

 

 

總結:

  1. 指標變數也是一個變數,是變數就可以賦值
  2. 指標指向誰,就把誰的地址賦值給指標
  3. *p操作的是指標所指向的記憶體

 

 

 

 

18 []不是陣列專屬

 

 

19 萬能指標和指標步長

 

 

1、  不可以定義void型別的普通變數 不能確定型別 編譯器就不知道分配多大空間

void a;

 

可以定義void *變數(因為大小是編譯器確定的

 

void * 指標也叫萬能指標

 

void *可以指向任何型別的變數(型別匹配)

 

void *p = NULL;

 

int a = 10;

 

p = &a;

 

printf(“*p = %d\n”,*p);  //*p操作指標所指向記憶體

 

這裡會報錯,

 

 

 

 

或者這樣寫,也是會報錯的

 

void *可以指向任何型別的變數,使用指標所指向的記憶體時,最好轉換為它v恩深的指標型別

答案: void *p指向了a了 操作*p的時候不知道應該操作多少位元組的記憶體

     所以就會報錯了

 

 

使用 void *p 的時候只儲存了  4個位元組中的一個位元組

 

int *指向int型別,操作記憶體時,操作4位元組

char *指向char型別,操作記憶體時,操作1位元組

 

int型別4位元組

char型別 1位元組

 

注意:

1、  指標的加法,不是傳提供的假髮

2、  步長由指標指向的資料型別決定

 

20 const修飾符的指標

 

 

注意加以區分:

 

 

21 陣列名

 

 

22 指向陣列首元素的指標

 

 

23_通過指標加減訪問陣列元素

 

24 作業