C/C++基礎知識

1、數據類型

1、1變數

​ 數據的容器,數據變容器不變

int a = 1;

1、2 基本類型

1、2、1 基本類型介紹

整型:int

字元型:char

float 單精度浮點型

double 雙精度浮點型

#include<stdio.h>
int main()
{
	//sizeof 求所佔位元組數
	printf("%d\n",sizeof(int));
	printf("%d\n",sizeof(char));
	printf("%d\n",sizeof(float));
	printf("%d\n",sizeof(double));
	return 0;
}

輸出:
    4
    1
    4
    8

1、2、2 限定符

short int : 使得 int 變短 (4 —> 2)

long int :使得 int 變長 (4—> 8)

#include<stdio.h>
int main()
{
	
	short int a = 1 ;
	long int b = 2;
	printf("%d\n",sizeof(a));
	printf("%d\n",sizeof(b));
    printf("%d\n",a);
	printf("%d\n",b);
	return 0;
}

輸出:
    2
    8
    1
    2

signed 有符號

unsigned 無符號

可用於修飾 char 和整型 (包括 short 和 long 修飾過的整型)

signed int  等價與 int
unsigned int 使得原有整型長度不變,但是最高位符號位也變成了數據位。僅能表示 0 和正數

signed char 強制 char 可以存儲有符號整數
unsigned char 強制 char 可以存儲無符號整數
不加限定 則是否有符號依據機器所定

1、2、3 常量表示形式

#include<stdio.h>
int main()
{
    //int 型 
    printf("%d\n",sizeof(10));
    // L long 型
    printf("%d\n",sizeof(10.L));
    // f float 型
    printf("%d\n",sizeof(10.f));
    //double
    printf("%d\n",sizeof(10.0));
	return 0;
}
輸出:
    4
    16
    4
    8

進位表示:
	默認 10 進位
	c = a + 31;
	c = a + 037   // 0 開頭表示8進位
	c = a + 0x1f  //0x開頭表示16進位
'0'
輸出 對應字元的 ASCII 碼
    
//字元串
「 I AM STRING」

1、3 數據類型轉換

1、3、1 自動轉換

#include<stdio.h>
int main()
{
    short int a = 1;
    int b = 1;
    float c = 1.0;
    double d = 1.1;
    printf("%d\n",sizeof(a));
    printf("%d\n",sizeof(a+b));
    printf("%d\n",sizeof(a+c));
    printf("%d\n",sizeof(a+d));
	return 0;
}

1、3、2 強制轉換

(類型名)表達式;
(float) a;
(int) (c+d);
(float) 5;

2、運算符

img

img

/* 三元運算符實例 */
   a = 10;
   b = (a == 1) ? 20: 30;
   printf( "b 的值是 %d\n", b );
 
   b = (a == 10) ? 20: 30;
   printf( "b 的值是 %d\n", b );

3、函數

3、1 定義

return_type function_name( parameter list );
返回值類型 + 函數名+(函數參數列表)

3、2 函數遞歸調用

img

3、3 作用域規則

#include<stdio.h>
函數參數 a 作用域僅限函數內部 所以無法改變外部變數的值
void f(int a){
    //局部變數生命周期只對函數調用這一段有效
    //函數執行完就被回收了
     a = 10;
}
int main()
{
    int a = 0;
    f();
    printf("%d",a);
	return 0;
}

輸出:0
如果我想通過函數改變外部變數呢?
//方式1:
        #include<stdio.h>
        // c++中將參數定義成引用型
        void f(int &a){
             a = 10;
        }
        int main()
        {
            int a = 0;
            f(a);
            printf("%d",a);
            return 0;
        }
//方式2:c語言中將函數參數定義成指針型,然後將變數地址傳入函數中
        #include<stdio.h>
        void f(int *a){
             a = 10;
        }
        int main()
        {
            int a = 0;
            //變數地址傳入
            f(&a);
            printf("%d",a);
            return 0;
        }
//語句塊的概念(局部程式碼塊):{}括起來的一條或多條語句
int main(){
    {
        int a = 0;
    }
     printf("%d",a);
}

輸出: error
//語句塊中定義的變數只在語句塊內有效

3、4 靜態變數

#include<stdio.h>
void f(){
    int a = 1;
    a++;
    printf("%d\n",a);
}
int main()
{
    for(int i = 0;i < 3; ++i){
        f();
    }
	return 0;
}
輸出:
    1
    1
    1
每次調用f()都會重新定義一個新的 a,原來的a被回收
//如果想在函數中操作同一個a,使其在函數調用完後不會被回收掉,可以使用靜態變數
#include<stdio.h>
void f(){
    static int a = 1;
    a++;
    printf("%d\n",a);
}
int main()
{
    for(int i = 0;i < 3; ++i){
        f();
    }
	return 0;
}
輸出:
    2
    3
    4

4、指針與數組

4、1什麼是指針?

//指針也就是記憶體地址,指針變數是用來存放記憶體地址的變數。
//指針變數聲明的一般形式為:
 type *var_name;
#include<stdio.h>
void f(){
    static int a = 1;
    ++a;
    printf("%d\n",a);
}
int main()
{
    int a = 1;
    //指針保存的是變數的地址值
    int *a_point = &a;
    printf("%p",a_point);
    //通過指針可以修改它指向變數的值
    //  ++a 先自增再傳值 a++ 先傳值再自增
    printf("%d",++*a_point);
	return 0;
}
輸出:0x7ffe26d3ca44
      2

4、2野指針

#include <stdio.h>
#include <stdlib.h>
//指針未初始化,它所被分配的地址空間可能隨機指向一個變數,如果這個變數很重要,那麼不小心對其進行修改會造成嚴重問題。
//如果沒有變數要指向,可以 int *point = NULL; 讓它指向一個任何變數都不會被分配到的地址
int main()
{
    int *point;
    printf("%d",point);
    return 0;
}
輸出:16(隨機數)

4、3指針和函數參數

img

4、2指針對數組的操作

#include<stdio.h>
void f(){
    static int a = 1;
    ++a;
    printf("%d\n",a);
}
int main()
{
    int a[5] = {1,2,3,4,5};
    //指針指向數組第一個元素的地址值
    int *p = a;
    for(int i = 0;i < 5;++i){
        //通過首地址增加,來順序訪問數組元素
        printf("%d\t",*(p+i));
    }
    
	return 0;
}
//字元型數組
char *s = "i am string "; //常量不可修改
char s1[] = "i am string"; //可修改
指針數組:
#include<stdio.h>

int main()
{
    int a[5] = {1,2,3,4,5};
    //指針數組中存的都是a中對應元素的地址
    int *p[] = {a,a+1,a+2,a+3,a+4};
    for(int i = 0;i < 5;++i){
        printf("%p\t",p[i]);
        printf("%d\t\n",*p[i]);
    }
    
	return 0;
}
輸出結果:
    0x7ffde1f97120	1	
    0x7ffde1f97124	2	
    0x7ffde1f97128	3	
    0x7ffde1f9712c	4	
    0x7ffde1f97130	5	

5、結構體

typedef :用來給類型取別名
    typedef int verType;
	verType a 等價於 int a
//封裝平面內的一個點的坐標(x,y)
struct{
	int x;
     int y
}point;
#include<stdio.h>
struct{
    int x;
    int y;
}point;
int main()
{
    point.x = 10;
    point.y = 20;
    printf("%d,%d",point.x,point.y);
	return 0;
}

5、1 給結構體取別名

typedef struct{
	int x;
     int y
}Point;

#include<stdio.h>
typedef struct{
    int x;
    int y;
}Point;
int main()
{
    Point point;
    point.x = 10;
    point.y = 20;
    printf("%d,%d",point.x,point.y);
	return 0;
}

5、2 指向結構的指針

#include<stdio.h>
typedef struct{
    int x;
    int y;
}Point;
int main()
{
    Point point;
    Point *p = NULL;
    p = &point;
    //指針指向分量: p->x
    //結構體指向分量 : p.x
    p->x = 10;
    p->y = 20;
    printf("%d,%d",p->x,p->y);
	return 0;
}

5、3 自引用結構

//自引用結構的指針

#include<stdio.h>
typedef struct Point{
    int x;
    int y; 
    struct Point *next;
}Point;
int main()
{
    Point p1,p2,p3,p4,p5;
    Point *p = NULL;
    p1.x = 1; p1.y = 2;
    p2.x = 3; p2.y = 4;
    p3.x = 5; p3.y = 6;
    p4.x = 7; p4.y = 8;
    p5.x = 9; p5.y = 10;
    
    p1.next = &p2;
    p2.next = &p3;
    p3.next = &p4;
    p4.next = &p5;
    p5.next = NULL;
    
    
    for (p = &p1; p!=NULL;p = p->next) {
        printf("(%d,%d)\n",p->x,p->y);
    }
   
	return 0;
}

輸出:
    (1,2)
    (3,4)
    (5,6)
    (7,8)
    (9,10)
		

6、類(C++)