技術(shù):
指針
有關(guān)知識:
c++ 指針 多繼承
java 單繼承 java運行在JVM(java虛擬機)
c指針:為什么要指針
地址 內(nèi)存空間
解決跨區(qū)域(不同作用域 不同代碼塊)之間的數(shù)據(jù)交互
野指針
“ ”
1.聲明/定義變量的時候 表示一個指針變量
float b =20;
int c =10;
int *al 定義一個指針變量指向的內(nèi)存空間只能存放整數(shù)
注意:定義一個指針變量的時候一定要給初值
ing *a =b;不行 指針變量只能存地址 不能存具體值
ing *a =b;不行 整型指針稚嫩存整形數(shù)據(jù)的地址
int *a =&c;正確
float *d = NULL;NULL指向內(nèi)存的起始地址 0x00
2.除了定義指針碧昂量之外 都是訪問某個地址的值
int *temp = =&c 定義指針變量1
*temp =21;訪問tmep地址里面的數(shù)據(jù) 賦值為21
指針變量本身在內(nèi)存空間內(nèi)占據(jù)8個字節(jié)
3.數(shù)組和指針的關(guān)系
數(shù)組名并不是一個變量 沒有分配內(nèi)存空間 int a= 20
指針變量是由內(nèi)存空間
定義一個數(shù)組 系統(tǒng)會分配內(nèi)存空間 可以存值
定義一個指針變量 職位變量本身分配8個字節(jié)內(nèi)存空間 無法存值 因為沒有為它分配可以存值的內(nèi)存空間
若想給指針指向的區(qū)域賦值
1.指針變量已經(jīng)指向某塊區(qū)域
int a =10;
int *pA =&a; 指向變量a的內(nèi)存
*pA = 30;
2.指針指向一個數(shù)組
int num2[10]= {};
int *pNum = num2 ; 指向數(shù)組num2的內(nèi)存
*(pNum+0) =20; 等價于 pNum[0] =20;
*(pNum+1) =30; 等價于 pNum[1] =30;
3.動態(tài)分配內(nèi)存 malloc realloc free
上面兩種指向的內(nèi)存都是別人的
希望分配一個屬于自己的內(nèi)存空間
自己分配的內(nèi)存空間必須自己釋放
普通變量的內(nèi)存是系統(tǒng)自己分配 屬于系統(tǒng)自己負責釋放
malloc 需添加 stdlib.h 頭文件
malloc(10*sizeof(char)); 創(chuàng)建十個字節(jié)的內(nèi)存
char *pName = malloc(10 * sizeof(char));
判斷分配是否成功
if(pName == NULL){
//分配失敗
return;
或者 exit(EXIT_FAILURE);
}
pName[0] = ‘j’;
pName[1] = ‘a(chǎn)’;
pName[2] = ‘c’;
printf(“%s\n”,pName);
當之前分配的內(nèi)存空間不合適 需要在之前的基礎(chǔ)上重新分配
realloc 必須是之前使用malloc分配過的
如果是系統(tǒng)分配的內(nèi)存 是不能使用realloc的
pName = realloc(pName,4 * sizeof(char));
用完要自己釋放內(nèi)存
free(pName);
結(jié)構(gòu)體
是一種數(shù)據(jù)類型 復合數(shù)據(jù)類型 struct
聲明一種類型 struct Person
struct Person{
char name[10];
int age;
char *addr;
}
定義結(jié)構(gòu)體struct Person變量
int i;
struct Person xw;
xw.name=”小王”//數(shù)組一旦定義 地址態(tài)改變
//不能直接給數(shù)組賦值
xw.name[0]= ‘x’;//系統(tǒng)為這個變量分配內(nèi)存了
xw.name[1]=’w’;
xw.addr =’西南大學’;//敞亮字符串的地址是由系統(tǒng)分配的
xw.addr = malloc (1*sizeof(char));
xw.addr[0]= ‘s’ //字符指針賦值 必須要有內(nèi)存
xw.age
結(jié)構(gòu)體所占的字節(jié)是4的倍數(shù) 小的按順序朝大的靠齊
定義一個學生結(jié)構(gòu)體
學號 姓名 年齡 數(shù)學成績
從終端輸入學生的信息
查詢
更改
刪除
增加
使用文件 數(shù)據(jù)持久化
將結(jié)構(gòu)體寫入文件
從文件里面讀取結(jié)構(gòu)體
文件
打開文件
r只讀 文件不存在就報錯 從頭開始讀
w只寫 文件不存在就創(chuàng)建 從頭開始寫
a只寫 從末尾開始寫
r+ w+ a+ 可讀可寫
FILE *fp=fopen(“abc.txt”,”w”);
寫入數(shù)據(jù)
fpurs(“abc”,fp);
將結(jié)構(gòu)體寫到文件里面去
fwrite(&xw1,sizeof(struct Student),1,fp);
讀取數(shù)據(jù)
fgets(temp,9,fp);
讀取文件中的結(jié)構(gòu)體
fread(&xw1,sizeof(struct Student),1,fp);
printf("name:%s\n",xw1.name);
printf("age:%d\n",xw1.age);
關(guān)閉文件
fclose(fp);
技術(shù)的實際使用
指針:
#include "stdafx.h"
#include "stdlib.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a = 30;
int *p = &a;
char *pName =malloc(10*sizeof(char*));
if(pName == NULL){
return;
}
pName[0] = 'M';
pName[1] = 'i';
pName[2] = 'k';
pName[3] = 'e';
printf("%s\n",pName);
free(pName);
return 0;
}
結(jié)構(gòu)體:
#include "stdafx.h"
#include "stdlib.h"
struct Person{
char name[10];
int age;
char *addr;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
struct Person Mike;
Mike.name[0]='M';
Mike.name[1]='i';
Mike.name[2]='k';
Mike.name[3]='e';
Mike.age=20;
Mike.addr = malloc (1*sizeof(char));
Mike.addr[0] = 's';
return 0;
}
文件:
#include "stdafx.h"
#include "iostream"
struct Student{
char name[10];
int age;
};
int _tmain(int argc, _TCHAR* argv[])
{
char temp[20];
struct Student xw1={"xiaowang",20};
FILE *fp=fopen("C:/Users/HP/Desktop/abc.txt","a+");
/*fputs("aaaaaaaaa",fp);
fgets(temp,9,fp);
printf("%s\n",temp);*/
fwrite(&xw1,sizeof(struct Student),1,fp);
fread(&xw1,sizeof(struct Student),1,fp);
printf("name:%s\n",xw1.name);
printf("age:%d\n",xw1.age);
fclose(fp);
system("pause");
return 0;
}
隨筆:
前幾天的學習和之前關(guān)于c語言的學習一直給我一種感覺,其實c語言挺簡單的,事實證明這個是個錯覺。c語言從入門到放棄需要多久?大概是幾個小時(誤?),其實也不是放棄,只是更加的看清自己,知道自己有幾斤幾兩。簡單的小程序?qū)懼鴽]問題,不代表可以寫工程比較龐大的程序。努力學習 up!