当前位置: 首页>C++>正文

[阿發你好]C/C++學習指南

[阿發你好]C/C++學習指南

這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
-###———————————————————————–


阿發你好第2章

輸出指定寬度的數字

#include <stdio.h>
#include <stdlib.h>
int main(){printf("number is %d\n", 3);printf("number is %d\n", 33);printf("number is %d\n", 333);printf("number is %4d\n", 3);printf("number is %4d\n", 33);printf("number is %4d\n", 333);//表示輸出都是4個自出長度printf("number is %04d\n", 3);printf("number is %04d\n", 33);printf("number is %04d\n", 333);//04d表示不足四位用0補齊system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這里寫圖片描述

#include "stdio.h"
int main(){printf("x=%lf\n",1.23424);return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

這里寫圖片描述

用變量表示小數
(我使用的IDE是kdevelop F8是編譯 F9是運行)

#include "stdio.h"
int main(){double a=1.123;printf("x=%lf\n",a);return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

指定小數后的位數

#include "stdio.h"
int main(){double a=1.12334;printf("x=%.2lf\n",a);return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

這里寫圖片描述
輸入一個長整型

#include "stdio.h"
int main(){scanf("%lf",&a);return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

變量的命名規則:必須是字母下劃線數字的組合,可以用字母或者下劃線開頭,但是不能用數字開頭
char 型變量能夠表示-128~127之間的整數2^7=128最高為是符號位。
long :4字節 占32位,
printf 可以輸出char short int 都可以

無符號類型

unsigned char 表示的范圍0~255 就是i原來2^8-1 就是255
在調用無符號整數用%u來表示
%u 在用scanf的時候,只能用unsigned int 來接收,不能用unsigned char/short

#include "stdio.h"
int main(){unsigned int a=0;scanf("%u\n",&a);return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

浮點類型

用于小數的類型有兩種:double,float 類型,統稱為浮點型,需要表示高的精度類型應該用double ,當精度要求不高的時候,用float類型

float a= 3.14f//這里數字后面要加一個f
scanf("%f\n",a);
  • 1
  • 2
  • 1
  • 2

單步調試

通常我們總是用F5進行編譯,原來不知道有F7也可以進行生成解決方案,用F10進行單步運行。用F9進行打斷點

第一次調用數組
  • 1
  • 1
#include <iostream>
using namespace std;
int main()
{int data[4] = { 1, 2, 3, 4 };int total=0;for (int i = 0; i <4; ++i){total += data[i];}cout << total<<endl;return 0;system("puase");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

如何描述一下錯誤:
前提條件:當我輸入…….的時候,
預期結果:可以正常編譯
實際結果:不是我預期的效果(或者是無法正常編譯)

對于測試人員:將問題進行復現,只有將問題復現才能解決

指針變量如何看他的地址:

這里寫圖片描述
在地址的框寫入p 然后按回車就可以自動把p的地址寫到這個里面

阿發你好 第3章

2016/11/13

十進制、十六進制的表示方法

int a=123;//表示的10進制
int a=0x123;//表示的16進制 將這個16進制的數化成10進制的話 等于3*16^0+2*16^1+1*16^2
  • 1
  • 2
  • 1
  • 2

內存的表示

內存使用在存儲計算機中的二進制數
內存的基本單元是字節,一個字節由8位二進制來表示
這里寫圖片描述
一個字節能夠表示的范圍是0~255
每個內存單元都是有地址的,地址表示的范圍;00000000~FFFFFFFF;

int a=10;//10就是一個字面常量,a就是一個變量
  • 1
  • 1

變量與內存

char 型變量:占1個字節
short型變量:占2個字節
int 型變量:占4個字節 4 個字節(4*8=32位 那么最大值:2^33-1)
float 類型占4個字節
double類型占8個字節

//用sizeof(int)可以返回出這個類型所占的字節
#include <iostream>
using namespace std;
int main()
{cout << sizeof(int) << endl;system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

這里寫圖片描述
然后求一個變量的所占的字節

#include <iostream>
using namespace std;
int main()
{int a = 10;cout << sizeof(a) << endl;system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

這里寫圖片描述

#include <iostream>
using namespace std;
int main()
{int a = 10;cout << &a<< endl;system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

這里寫圖片描述
一個字節能夠表示的范圍;00~FF
在C語言中,我們用sizeof來測量一個變量或者類型的大小

const 限制符

如果一個東西,被const修飾之后,那么他就變成一個只讀的常量

字面值常量

int a=1;//1 就是字面值常量,a是一個變量。
  • 1
  • 1

阿發你好 第4章 數組

數組的初始化

 char arr[4]={1,2,3,4};
  • 1
  • 1

注意事項:
1、char arr[3];//可以在定義的時候,不初始化初值
2、
char arr[3]={1};//可以只初始化部分初值
3、
char arr[]={1,2};//可以只有數值沒有長度`
4、char arr[5]={0};

訪問數組的元素

char arr[3];
arr[0]=1;
  • 1
  • 2
  • 1
  • 2

用sizeof(arr)來訪問數組的長度

char arr[3];
sizeof(arr);
  • 1
  • 2
  • 1
  • 2

多維數組

int arr[1][2];
arr[0][0]=1;
  • 1
  • 2
  • 1
  • 2

對一個二唯數組進行初始化

int a[3][4]=
{
    {11,12,13},
    {21,22,23},
    {31,32,33},
    {41,42,43},
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

阿發你好第5章 字符與字符串數組

在printf的時候我們用%c來表示字符串

char ch=65;
printf("%c",ch);
  • 1
  • 2
  • 1
  • 2

輸出的結果是A
字符常量

char ch='a';
printf("%d",ch);
  • 1
  • 2
  • 1
  • 2

字符數組

1、一般的初始化方法

char str[3]={'i','l','\0'};
  • 1
  • 1

2、特殊的初始化方法

char str[3]="il";//最后默認添加了/0來表示數組的終止
  • 1
  • 1

輸出字符串
用printf向程序輸出字符串的話,使用格式符%s

char str[2]="I";
printf("%s\n",str);
  • 1
  • 2
  • 1
  • 2

可以使用gets來獲取一個字符串

char burf[2];
gets (burf);gets()的括號里面是數組的名字
printf("%s/n",burf);
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

在編寫字符串的時候一定要有/0來便是終止。

char str[]={'I',0};
printf("%s",str);
  • 1
  • 2
  • 1
  • 2

在輸出的時候,碰到0就截止
轉義字符
1、\n 換行
2、\用于輸出目錄
3、\t輸出制表符
4、輸出引號printf(“\”asdf”\”);


阿發你好第6章 表達式與操作符

算數表達式
賦值表達式
關系表達式
條件表達式

expr1?expr2:expr3;
如果條件expr1為真的時候就執行expr2,否則執行expr3
這個是一個表達式
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

舉個例子:

printf("%c\n",score>60'T':'F');
  • 1
  • 1

我們都是用這條語句來簡化計算的
邏輯表達式
!表示非 && 用來表示與 || 用來表示 或

逗號表達式

expr1,expr2,expr3
  • 1
  • 1

是從逗號分開的一組表示式,從左到右依次計算,最后一個表達式為整個表示式的值

int nnn=(1,2,3);//賦值的最后結果是nnn=3
  • 1
  • 1

自增自減運算符

阿發你好第7章 語句

if語句

if (expr)statement1
else (expr)staement2
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

switch語句

switch(expr)
{
case option_1:  break;
case option_2:  break;
case option_3:  break;
case option_4:  break;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

switch 語句的注意事項:
1、switch和case的選項必須都是整型
case的選項的值必須常量

for語句

for (expr1;expr2;expr3){statement;}
  • 1
  • 2
  • 1
  • 2

在for語句中,如果存在break語句,可以直接跳出for循環
continue語句如果存在for語句大括號內,
當continue語句被執行的時候,表示結束本次循環,直接進入下一次循環


while語句

while語句也用于是實現循環,他的基本表達形式:

while (expr)//當expr為1的時候,進入循環體statement
  • 1
  • 2
  • 1
  • 2

t

//將編寫的條件內置
int main(){int i=0;while(1){if(i>100)break;//當i=101的時候,直接跳出循環i++;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
int day=2;
switch(day)
{
case 1: printf("1");
break;//如果沒有break的話,程序會從匹配的入口依次往下執行
case 2:printf("2");
break;
default: printf("3");
break;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

do while 語句

do
{
statement
}while(expr1)
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

首先執行statement,當while(expr)為真的的時候,返回循環,為假,跳出循環


阿發你好 第8章 函數

全局變量與局部變量

#include<stdio.h>
int arr[3]={0,1,2};
int main(){
printf("%d",arr[2]);
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

函數的聲明

#include<stdio.h>
int find_q(int a);//函數聲明部分
int main(){return 0;
}
int find_q(int a){
statement;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

參數的默認值
1、具有默認值的參數必須在列的最后面
2、當函數的聲明與定義分來的時候,不能寫在定義里面

也就是說,在聲明里面添加默認值,不能寫在定義里面
#include<stdio.h>
void funtion(int a, int b, int c=1);
int main(){return 0;
}
void function(int a.int b, int c)
{
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

內聯函數 inline關鍵字

inline int max(int a, int b)
{return 0;
}
int main()
{int a=max(1,2);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

函數的遞歸

阿發你好 第9章 指針

指針類型用于表示地址
星號操作符號,直接用于指針變量上,直接用來讀寫內存值的
下面是代碼`#include
using namespace std;
int main()
{
int a = 0;
int *p = &a;
*p = 0x11;//修改內存里的內容
*p = 0x12;
a=0x14;
system(“pause”);
}


這里寫圖片描述

這里寫圖片描述

&以為向下走,也就是去取地址
*相當于往上走,去地址中的內容
*p 可以用修改地址中的內容,他的效果和a修改的效果是一樣
p則表示的a所在位置的地址。

#include <iostream>
using namespace std;
int main()
{int arr[4] = { 1, 2, 3, 4 };system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查看一個數組的地址,直接輸入數組名就可以了
這里寫圖片描述
數組名稱,本身就是一個內存的地址

指針的類型:
1、chat* :表示一個char型變量的地址
2、short* : 表示一個short型變量的地址
3、int* : 表示一個int型變量的地址
4、float* : 表示一個float型變量的地址
5、double * :表示一個double型變量的地址

在打印的地址的時候用%p來表示指針類型

#include <iostream>
using namespace std;
int main()
{int arr[4] = { 1, 2, 3, 4 };int *p1 = arr;int *p2 = &arr[0];//這兩句是等價的system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

這里寫圖片描述
這種寫法值得注意:int *p=arr;

指針的移動

#include <iostream>
using namespace std;
int main()
{int arr[4] = { 1, 2, 3, 4 };int *p1 = arr;int *p2 = &arr[0];//這兩句是等價的p1 += 1;cout << *p1;system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

這里寫圖片描述
總結:等式左邊表示聲明他的類型

#include <iostream>
using namespace std;
int main()
{int arr[4] = { 1, 2, 3, 4 };int *p = &arr[1];p[0] = 0xAA;p[1] = 0xBB;return 0;system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

也就是說通過p修改了數組arr中的元素
實例說明P修改arr中的元素

#include <iostream>
using namespace std;
int main()
{int arr[4] = { 1, 2, 3, 4 };int *p = arr;for (int i = 0; i < 4; ++i){p[i] += p[i];cout << p[i]<< endl;}for (int ii = 0; ii < 4;++ii){cout << arr[ii] << endl;}system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

這里寫圖片描述

把指針作為一個函數的參數來使用

#include <iostream>
using namespace std;
void test(int *p);
int main()
{int a =0x11;test(&a);system("pause");
}
void test(int *p)
{*p=0x12;cout << "change the value:" << *p << endl;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

這里寫圖片描述

const int *p=&a;//也就是說明 p指針只能指向a,或者的表示只能讀,不能寫
int *const p=&a;//這就是說p不能被修改,而*p可以被修改
  • 1
  • 2
  • 1
  • 2

指針只能指向變量或者數組
野指針就是指的那個沒有指向變量和數組的指針
**空指針**iint *p=0;

#include <iostream>
using namespace std;
int main()
{int *p = 0;if (p){cout << "p不是一個空指針" << endl;}system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

這里寫圖片描述
這里寫圖片描述說明輸出結果就時一個空指針
也就是說,當你傳入一個空指針的時候,一個函數是有辦法判斷他是不是一個空指針的

數組作為函數的參數

int arg(int *p, int len)
{int sum=0;
}
int main()
{int arr[]={0,1,2,3};int n;n=avg(arr,3)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
方法1int avg(int *p,int len)
方法2int avg(int p[],int len)
  • 1
  • 2
  • 1
  • 2

當數組作為函數的參數的時候的引用。

#include<stdio.h>
int avg(int*p,int len )
{int sum = 0;for (int i = 0; i < len; i++){sum += p[i];}return sum ;
}
int main(){int arr[4] = { 1, 2, 3, 4 };int rect = 0;rect = avg(arr, 4);printf("%d", rect);int a;getchar();//scanf("%d\n",&a);return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

指針類型作為函數的返回值

#include <iostream>
#include <stdlib.h>
int number = 1;
int *get()
{return &number;
}
int main()
{int *p = get();//*p = 12;printf("%d\n", p);printf("%d\n", *p);system("pause");return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

const指針
在普通的指針類型上加上關鍵字const修飾,叫做const指針類型
const的作用封禁了信號操作里的寫內存功能

int test(const int *p, int len)
{
}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

const指針常用于限定函數參數
這個參數限定為const類型,用于顯式地指定:“該函數是輸入參數,在函數里只是讀取內存的值,而不會修改這個內存的值”

void * 型指針
void * 型指針僅僅表示一個內存地址,它不指明內存里的存放何種類型的數據。
void * 型指針不支持加減法

空指針的使用

int *p=0;//空指針
if(p)//用if語句來判斷指針類型是否為空值
{printf("%d\n",*p);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

指針的使用規范:
1、杜絕野指針
當一個指針初始化的時候,要么將其置為空指針,要么將其指向為某個變量的地址
2、防止數組越界
3、目標內存是否已經生效
用一個指針指向一個變量,但是要注意這個變量的作用域。

二重指針

指針也是變量,凡是變量就是有地址

int **p=&q;
  • 1
  • 1
#include<stdio.h>
int number=0;
void set(int **p )
{*p=&number;
}
int main()
{int *p=NULL;set(&p);*p=23;return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

二維數組

順次打印這個行列式的值

#include <stdlib.h>
#include <iostream>
using namespace std;
void test(int data[][4], int rows)//打印這個行列式
{for (int i = 0; i < rows;i++){for (int j = 0; j < 4;j++){printf("%d\n", data[i][j]);}}
}
int main()
{int arr[2][4] ={{ 1, 2, 3, 4 },{ 11, 12, 13, 14 }, };test(arr, 2);system("pause");return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

二維數組和指針之間的變換

int aa[6][4];
int (* row0)[4]=aa;//row0:指向第0行
int (* row1)[4]=aa;//row1:指向第1行
(*row0)[0]=1;//第一種方法:使用指針的方式,訪問第0行第0列;
row0[0][1]=2;
row[0][0]=3;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

阿發你好 第10章 結構體

這里寫圖片描述

結構體的定義和初始化

這里寫圖片描述
定義結構體數組
這里寫圖片描述

結構體的賦值:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct Highschool
{char name;int num;int  phone;};
int main()
{Highschool a={ 'c', 1, 2 };Highschool b = a;//將a中的數據賦值給bcout << b.name << endl;system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

這里寫圖片描述

結構體訪問

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct Highschool
{char name;int num;int  phone;};
int main()
{Highschool a={ 'c', 1, 2 };Highschool *p = &a;cout << p->name << endl;//使用->箭頭來訪問結構體的成員變量(這是常用寫法)cout<<(*p).id<<endl;system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

結構體作為函數的參數

這里寫圖片描述

結構體作為函數的返回值

這里寫圖片描述

匿名struct

using namespace std;
struct 
{char name;int num;int  phone;} info;
int main()
{info.num = 1;cout << info.num << endl;system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這里寫圖片描述
注意事項:
大括號只能用于初始化、不能直接用在賦值上

strcpy 函數用于復制字符串,在使用之前需要向其中添加#include<string.h>
  • 1
  • 1

結構體的內存視圖

struct 
{int id;char name[8];
}obj
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

一個obj占據12個字節,一個char是占一個字節,那么一個id是4個字節,一個name[8]占據8個字節

結構體指針

contact *p=&a;//結構體加上相應的*號就相當于對應類型的指針類型
p->id=123;//對于結構體指針類型用->來訪問對象的數據成員
  • 1
  • 2
  • 1
  • 2

將結構體作為函數的參數

作為傳值方式

void test(contact a)
{
printf("id is %d/n name is %s",a.id,a.name)
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

作為傳地址的方式

void test(contact *a)
{
printf("id is %d/n name is %s/n",a->id, a->name);
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

作為函數的返回值

和基本的結構體一樣、結構體類型也可以作為函數返回值的類型

contact create(int id)
{contact a;a.id=id;return a;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

結構體作為結構體的成員函數

成員函數的類型也可以是結構體類型

struct color
{unsigned char r;unsigned char g;unsigned char b;
};
struct object
{int x,y;color rgb
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
object obj=
{1,2,{0xFF,0X00,0X00}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

結構體緊湊的表示方式

struct object
{
int x;
int y;
}a,*p;//在這里直接初始化兩個對象,一個結構體類型的a,和一個結構體指針類型的*p
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

傳值和傳地址

傳值-是說明:在傳遞參數的時候,如果傳入對象是一個值,那么就叫做傳值
傳地址-是說明:在傳遞參數的時候,如果傳入的對象是一個地址,那么就叫做傳地址

位字段 bit-filed

在結構體當中有一種特殊的成員,叫做位字段。他是在變量名后面加冒號,然后標明該字段到底占用了多少個位
Struct object
{
Unsigned char a : 1;
Unsigned char b : 2;
};
表明該字段到底是占了1位,如果是1位的話,則只能取值[0,1],占了2位,取值范圍[0~3],占了三位[0~7]

聯合體union

Union 在實際的工程當中,一般不會使用這個語法,學這個語法的目的,只是為了讀懂一種老舊的C語言代碼

Union somedata
{
Unsigned int a;
Unsigned char b;
Char c[10];
}
聯合體是共享同一片內存區域的

聯合體的大小就是所有成員里體積最大的那個成員的大小

阿發你好 第12章 動態分配內存

在操作系統中,有一個內存管理器(MM),
在C語言中,內存的管理和釋放用malloc/free這兩個函數來調用
malloc申請內存,申請的內存在堆區(heap)
一個系統當中只有一個內存管理器,系統中所有的進程都向同一個內存管理器來申請內存。
內存泄漏:就是程序長時間運行,如果不能及時清理內存,內存積累的就會越來越多,導致系統沒有內存空間可是使用,這種現象,就是內存泄漏。
對象的分類:
1、全局對象
2、局部對象
3、動態對象
一個對象就對應了一塊內存,對象的值就是內存里的數據

阿發你好 第13章 鏈表

鏈表是一種數據的組織方式

鏈表的構造

struct student
{int id;char name[16];student *next;//添加一個指針用于指向下一個對象
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

初始化一個結構體數組

student ss[4]=
{{123,"123",0},{123,"123",1},{123,"123",2}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

將這三個對象串聯起來

ss[0].next=&ss[1];
ss[1].next=&ss[2];
ss[2].next=0;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

頭結點和末節點

//當若干個對象別串起來的時候,只需要添加第一個對象,就可以訪問到鏈表中的每一個對象
student *p=&ss[0];
while(p)
{printf("%d,%s",p->id,p->name)p=p->next;//指向下一個對象
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

鏈表頭的作用:鏈表頭可以用于代表整個鏈表

有頭鏈表

有一個固定的頭節點來指代整個鏈表,所有的對象都掛在這個頭節點下面,而頭節點本身不包含有效數據
使用頭鏈表的目的是,簡化鏈表的操作使之容易實現
頭部的節點稱為頭節點,后面的節點稱為數據節點
這個部分我就先跳過了,等有機會再去寫吧

阿發你好 第14章 引用

struct object
{int value;
}
int main()
{object a = {1};object &r =a;//r相當于a的一個別名
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

指針和引用的最大的區別在于:引用在定義的時候,必須關聯到一個對象。而指針的話,不必在初始化的時候就指向一個對象,可以指向一個空指針

int a=123;
int &r=a;
  • 1
  • 2
  • 1
  • 2
object a={1};
object &r=a;
object *p=&r;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

作為函數的參數

void test(object &r)
{r.value=1;
}
int main()
{object a={1};test(a);return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

作為函數的返回值

object the_object={123};
object *test()
{
return &the_object;
}
int main()
{object *p=test();p->value=456;return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

阿發你好 第15章

C風格字符串
字符串通常以3種形式存在:字符數組、動態字符串常量和字符串常量
字符串數組
并不是所有的char*都叫做字符串,實際上,只有當這塊內存用于存儲字符串的時候,我們才稱他為字符串,如果只是把它用于存儲于一些普通的數據,則不能不他稱為字符串。

遍歷字符串

遍歷字符串,有兩種方法:1、索引遍歷;2、指針遍歷。

字符串的比較

在<string.h>中、用strcmp函數來比較這兩個字符串
  • 1
  • 1

字符串的插入與刪除
字符串的分割
使用數組還是指針?
1、數組的方式
優點:1、安全,不必維護指針
2、操作簡單
缺點:1、浪費空間
2、不適用較長的字符串

阿發你好 第16章 標準C語言庫

標準C語言庫也被稱為:ANSI C 函數庫

stdio.h

getchar()、putchar()//向控制臺輸入、輸出一個字符
gets()、puts()//輸入字符串、輸出字符串
sprintf、sscanf()//

math.h

abs 取絕對值
ceil 向上取整
floor 向下取整
pow 求x的y次冪
sqrt 求平方根

time.h

time_t是一個typedef

stdlib.h

atoi/atof 字符串轉化成數字
rand/srand 隨機數生成
以及system里面的函數

stdio.h

1fopen:打開文件
2fwrite: 寫入數據
3fclose: 關閉文件
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

阿發你好 第17章 文件操作

#include<stdio.h>
int main()
{const char *filename="c:/aaa.txt";FILE * fp=fopen(filename,"rb");if(fp==NULL){printf("fail to open file");return -1;}char buf[123];int n=fread(buf,1,123,fp);fclose(fp);return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

數據的存儲格式

存儲char類型的整數

char ch=12;
fwrite(&ch,1,1,fp);//存入
fread(&ch,1,1,fp);//讀取
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

存儲int型的整數

int n=12;
fwrite(&n,1,sizeof(int),fp);//存
fread(&n,1,sizeof(int),fp);//取
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

存取double類型的小數

double value=23.23;
fwrite(&value,1,sizeof(value),fp);
fread(&value,1,sizeof(value),fp);
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

存取結構體型數據

object obj={123};
fwrite(&obj,1,sizeof(value),fp);
fread(&obj,1,sizeof(value),fp);
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

存取字符串結構

char name[32]="adf";
fwrite(name,1,sizeof(name),fp);
fread(name,1,sizeof(name),fp);
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

指針指向的對象

Run-Length Encoding 存儲

RLE是一種常見的編碼技術、用于存儲字符串的信息
fprintf是一種按行進行格式化寫入
fgets是按行進行讀取

文件的隨機訪問

順序訪問:按照順序訪問,不能隨意跳躍
隨機訪問:可以任意調到一個任何位置進行訪問
fseek隨機訪問
文件的打開模式:
wb是寫模式,rb是讀模式

阿發你好 第18章 多文件項目以及編程過程

extern 聲明全局函數

假設一個項目里面有A.cpp和B.cpp,我想實現在A.cpp當中調用B.cpp里定義的函數

extern 聲明全局變量

extern的作用是通知編輯器,在本CPP中要用到某個符號,這個符號可能不在本cpp中定義

多文件項目的生成

C++項目生成過程主要分成2步:1、編譯;2、鏈接
在編譯階段:cpp文件中的代碼轉換成中間文件

全量編譯和增量編譯

全量編譯:將所有的CPP 文件都編譯一遍
和增量編譯:只對改變的量進行編譯

宏定義#define指定

所有以#為開頭的行都是預處理指令

#define 語法就是對他進行原文替換
  • 1
  • 1

常見的幾個宏定義

1、NULL 空指針

#define NULL 0
或者
#define NULL (void*) 0
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

條件編譯指令 #if … #endif

條件編譯指令 #ifdef … #endif

#ifdef 表示如果對應的宏有定義,那么則相應的代碼被編譯
同時也可以用#undef來去除定義
  • 1
  • 2
  • 1
  • 2
#ifndef 表示的意思和 #ifdef恰好相反
也就是說,當對應的宏不存在的時候,才能編譯相應的代碼
  • 1
  • 2
  • 1
  • 2
int main(int argc, char **argv)
  • 1
  • 1

static

static 表示的是靜態變量,當static修飾一個函數,稱為靜態函數,當static修飾一個變量的時候,稱為靜態變量。

https://www.nshth.com/cplus/338535.html
>

相关文章:

  • 樹莓派的控制方法,第二篇 樹莓派基本外設基礎篇
  • 手機如何連接外設,iOS連接外設的幾種方式
  • switch可以外接鍵鼠嗎,別再給手機外接OTG鍵鼠玩刺激戰場了:其實還能這樣操作
  • [阿發你好]C/C++學習指南
  • 輸入法哪個最好用,wsl2中安裝中文輸入法
  • 字符串中引入變量方法,字符串處理、變量初始值處理、擴展的腳本技巧、正則表達式
  • 某計算機內存容量是512kb,某計算機主存容量為512kb,Cache容量為16kb,每塊有16個字,每字32位。 (1...
  • 中國工商網商標查詢,工商局爬蟲 商標網爬蟲
  • iOS真機調試TestFlight安裝及提交App Store審核教程
  • 蘋果app上架流程,小白如何在ios中安裝ios上架
  • 蘋果彈出提交表格是什么,蘋果TestFlight測試操作圖文教程(測試后提交App Store審核)
  • 四門外語傍身:外語,讓我的大學如此完美
  • D3D Surface/Texture SDL DDraw渲染視頻的區別和疑問
  • 手機VR播放器,Android VR Player(全景視頻播放器) [10]: VR全景視頻渲染播放的實現(exoplayer,glsurfaceview,o
  • Qt渲染視頻常見問題(視頻渲染窗口上子窗口設置透明出現陰影問題、主窗口縮放導致視頻渲染窗口部分出現視頻閃爍問題)
  • 視頻解析網站源碼,ijkplayer源碼分析 視頻渲染流程
  • 一分鐘的視頻渲染要多久,基礎教程|如何在數分鐘時間內渲染超清精美視頻?
  • Metal(六) 案例之視頻文件的渲染
  • flutter開發小程序,最強整理!寫給程序員的Flutter詳細教程,大廠直通車!
  • c++黑客編程揭秘與防范,C/C++截獲騰訊QQ網絡聊天系統內容和登錄密碼,教你做一個黑客!
  • 支付行業具體做什么,做支付需要了解哪些行業知識
  • 5大底層邏輯,淺談HyperLogLog底層算法邏輯
  • c++實現復數的加減乘除,【C++】輔助C++計算復數(代碼解釋的很清楚)
  • nlogn的算法有哪些,算法運行時間1、logN、N、NlogN 、N^2、N^3、2^n之間的比較
  • 開源圖片庫,幾種常用圖像處理開源庫簡介及使用總結
  • 圖像處理和計算機視覺,《圖像處理與計算機視覺算法及應用》讀后感
  • gps定位,側邊欄固定定位到版心兩側
  • css版心怎么設置,[css]版心和布局流程
  • 瀏覽器多個窗口怎么設置在一個頁面,網頁多種版心適應多屏幕技巧
  • 前端學習之版心和布局流程