C語言指標描述
C語言 指標語法
#include<stdio.h>
#include<stdlib.h>
main(){
int a=10;
int* pointer=&a;
}
C語言裡面的指標只能操作地址
指標賦值給變數
int a = 10;
int* pointer = &a;//吧地址賦值給指標 指標本身是儲存地址的
int b = *pointer;
-
指標 int i = 123; int* pointer = &i;
-
pointer 取到的是i的地址
-
*pointer 取到的是i的值
-
&pointer 取出pointer自己的地址
-
野指標 指標賦值操作之前要先初始化 給指標變數賦一個程式中宣告的變數的地址
-
int* 指向int型別變數的地址
-
值傳遞和引用傳遞 都是傳遞的值 但是引用傳遞傳遞的是地址值 子函式修改main函式的變數的值 一定要用引用傳遞
-
指標和陣列的關係 陣列就是連續的記憶體空間 拿到陣列的首地址 就可以對陣列的每一個元素進行操作 通過指標的位移運算 位移運算 指標變數+1移動的位元組數跟指標的型別有關
-
指標的長度 32位作業系統4個位元組 64位 8位元組
利用指標返回多個值 : 在C語言裡面方法是不能返回陣列的如果使用返回多個值可以通過指標改變該地址內容
#include<stdio.h> #include<stdlib.h> /** "*" 的幾個含義 int* 宣告一個int型別的指標變數 x * y 乘法運算 int* pointer; *pointer; 取出指標變數pointer 中儲存的記憶體地址對應的記憶體中的值 */ main(){ int i =1; int j = 2; //char c; function(&i,&j); printf("i = %d,j = %d\n",i,j); system("pause"); } function(int* pointer, int* pointer2){ *pointer *= 2; *pointer2 *=2; }
陣列與指標的干係
#include<stdio.h>
#include<stdlib.h>
/**
陣列實際上就是一塊連續的記憶體空間
*/
main(){
char array[]={'a','b','c','d'};
//int array[]={1,2,3,4};
printf("array[0]=%#x\n",&array[0]);
printf("array[1]=%#x\n",&array[1]);
printf("array[2]=%#x\n",&array[2]);
printf("array[3]=%#x\n",&array[3]);
//陣列變數名的地址實際上是第一個元素的地址
char* pointer = &array;//表示吧陣列地址付指標 陣列每個單位多有一個獨立的地址
//在陣列於指標裡面 如這個*(pointer+0) 要開位數 如char 是 1 位 可以加一 如果是int 是4位 沒有任何用
printf("*(pointer+0) = %c\n",*(pointer+0));
printf("*(pointer+1) = %c\n",*(pointer+1));
printf("*(pointer+2) = %c\n",*(pointer+2));
printf("*(pointer+3) = %c\n",*(pointer+3));
}
多級指標
多級指標 數星星 有幾個星就是幾級指標 取值通過三級指標拿到最初的變數的值 ***point3
#include<stdio.h>
#include<stdlib.h>
/**
多級指標 數星星 有幾個星就是幾級指標 取值通過三級指標拿到最初的變數的值 ***point3
*/
main(){
int i = 123;
//int型別的一級指標
int* pointer = &i;
//int型別的二級指標 二級指標只能儲存一級指標的地址
int** pointer2 = &pointer;
//int型別的三級指標 三級指標只能存二級指標
int*** pointer3 = &pointer2;
printf("***pointer3 = %d\n",***pointer3);
system("pause");
}
C語言結構體
c語言結構體就是java裡面 的物件類差不多下面看看例子
#include<stdio.h>
#include<stdlib.h>
/**
c結構體 類似java的class struct來宣告c的結構體
結構體的大小大於等於結構體中每一變數的佔位元組數的和
結構體的大小是最大的那個變數所佔位元組數的整數倍
C結構體中不能定義函式
函式指標的定義 返回值(*函式指標變數名字)(返回值);
-> 間接引用運算子
*/
void study(){
printf("good good study!\n");
}
struct Student{
int age; //8
int score; // 4
char sex; //1
void(*studypointer)();// 函式指標的定義
};
main(){
stud stu = {18,100,'f'};
stu.studypointer = &study;
stu.studypointer();//呼叫結構體裡面的方法
struct Student* stuPointer = &stu;//結構體指標使用
printf("*stuPointer.age = %d\n",(*stuPointer).age);
(*stuPointer).sex ='m';//改變結構體的值
printf("stu.sex = %c\n",stu.sex);
printf("stuPointer->age = %d",stuPointer->age);//stuPointer->age 間接引用運算子
//printf("stu.age = %hd\n",stu.age);
//printf("stu.score = %d\n",stu.score);
//printf("stu.sex = %c\n",stu.sex);
// printf("結構體student佔%d個位元組\n",sizeof(stu));
system("pause");
}
C語言的聯合體
#include<stdio.h>
#include<stdlib.h>
/**
聯合體佔位元組數取決於 其中成員 佔記憶體空間最大的那一個
也稱為共用體 一般用於記憶體比較小的機器
*/
union u{
int num; //4
double d; //8
}
main(){
union u u1;
u1.num = 123;
u1.d = 123.456;
printf("union佔%d個位元組\n",sizeof(u1));
printf("u1.num = %d\n",u1.num); //
system("pause");
}
C語言列舉
#include<stdio.h>
#include<stdlib.h>
/**
*/
enum weekday{
MON=9, TUE, WEND,THUR,FRI,SAT,SUN
};
main(){
enum weekday day = MONe;
printf("day= %d",day);
system("pause");
}
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
(1) 列舉型是一個集合,集合中的元素(列舉成員)是一些命名的整型常量,元素之間用逗號,隔開。
(2) DAY是一個識別符號,可以看成這個集合的名字,是一個可選項,即是可有可無的項。
(3) 第一個列舉成員的預設值為整型的0,後續列舉成員的值在前一個成員上加1。
(4) 可以人為設定列舉成員的值,從而自定義某個範圍內的整數。
(5) 列舉型是預處理指令#define的替代。
(6) 型別定義以分號;結束。
2. 使用列舉型別對變數進行宣告
新的資料型別定義完成後,它就可以使用了。我們已經見過最基本的資料型別,如:整型int, 單精度浮點型float, 雙精度浮點型double, 字元型char, 短整型short等等。用這些基本資料型別宣告變數通常是這樣:
char a; //變數a的型別均為字元型char
char letter;
int x,
y,
z; //變數x,y和z的型別均為整型int
int number;
double m, n;
double result; //變數result的型別為雙精度浮點型double
既然列舉也是一種資料型別,那麼它和基本資料型別一樣也可以對變數進行宣告。
方法一:列舉型別的定義和變數的宣告分開
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY yesterday;
enum DAY today;
enum DAY tomorrow; //變數tomorrow的型別為列舉型enum DAY
enum DAY good_day, bad_day; //變數good_day和bad_day的型別均為列舉型enum DAY
方法二:型別定義與變數宣告同時進行:
enum //跟第一個定義不同的是,此處的標號DAY省略,這是允許的。
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //變數workday的型別為列舉型enum DAYenum //跟第一個定義不
enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //變數days的型別為列舉型enum week
enum BOOLEAN { false, true } end_flag, match_flag; //定義列舉型別並聲明瞭兩個列舉型變數
方法三:用typedef關鍵字將列舉型別定義成別名,並利用該別名進行變數宣告:
typedef enum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此處的workday為列舉型enum workday的別名
workday today, tomorrow; //變數today和tomorrow的型別為列舉型workday,也即enum workday
enum workday中的workday可以省略:
typedef enum
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此處的workday為列舉型enum workday的別名
workday today, tomorrow; //變數today和tomorrow的型別為列舉型workday,也即enum workday
也可以用這種方式:
typedef enum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
};
workday today, tomorrow; //變數today和tomorrow的型別為列舉型workday,也即enum workday
注意:同一個程式中不能定義同名的列舉型別,不同的列舉型別中也不能存在同名的命名常量。錯誤示例如下所示:
C語言自定義型別
C語言自定義型別就是取別名
#include<stdio.h>
#include<stdlib.h>
/**
*/
typedef int i;
main(){
i j = 123;
printf("j = %d\n",j);
system("pause");
}