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、運算符
/* 三元運算符實例 */
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 函數遞歸調用
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指針和函數參數
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++)