指針
每一個變量都有一個記憶體位置,每一個記憶體位置都定義了可使用 & 運算符通路的位址,它表示了在記憶體中的一個位址。
指針也就是記憶體位址,指針變量是用來存放記憶體位址的變量。
指針的聲明
int *ip; /* 一個整型的指針 */
double *dp; /* 一個 double 型的指針 */
float *fp; /* 一個浮點型的指針 */
char *ch; /* 一個字元型的指針 */
注:所有實際資料類型,不管是整型、浮點型、字元型,還是其他的資料類型,對應指針的值的類型都是一樣的,都是一個代表記憶體位址的長的十六進制數。不同資料類型的指針之間唯一的不同是,指針所指向的變量或常量的資料類型不同。
使用指針
使用指針時會頻繁進行以下幾個操作:定義一個指針變量、把變量位址指派給指針、通路指針變量中可用位址的值
#include <stdio.h>
int main ()
{
int var = 20; /* 實際變量的聲明 */
int *ip; /* 指針變量的聲明 */
ip = &var; /* 在指針變量中存儲 var 的位址 */
printf("var 變量的位址: %p\n", &var );
/* 在指針變量中存儲的位址 */
printf("ip 變量存儲的位址: %p\n", ip );
/* 使用指針通路值 */
printf("*ip 變量的值: %d\n", *ip );
return 0;
}
運作結果為:
var 變量的位址: 0x7ffeeef168d8
ip 變量存儲的位址: 0x7ffeeef168d8
*ip 變量的值: 20
注:單說一個指針名代表的是位址,指針名+“*”可以代表指針中存儲的變量
結構體指針
結構體中的指針
指針與其他一樣也是一種資料類型,也可以在結構體中聲明:
#include <stdio.h>
typedef struct
{
float temperature; //溫度
char humidity; //濕度
char alcohol; //酒精濃度
int illumination; //光照強度
char CO; //一氧化碳濃度
int *p; // int型的指針變量
} sensor;
sensor sen; //定義結構體變量
int value = 0;
int main(void)
{
sen.p=&value;//對value的位址指派
printf("value=%d\r\n",*(sen.p));
printf("%d\r\n",sen.p);}
上面的例子相當于将結構體中的p指針指向了變量value的位址
指向結構體的指針
定義指向結構的指針,方式與定義指向其他類型變量的指針相似
sensor *Psen;
可以在上述定義的指針變量中存儲結構變量的位址。為了查找結構變量的位址,把 & 運算符放在結構名稱的前面:
Psen = &sen;
為了使用指向該結構的指針通路結構的成員,必須使用 -> 運算符:
Psen->humidity=20;
一個例子:
#include <stdio.h>
typedef struct
{
float temperature; //溫度
char humidity; //濕度
char alcohol; //酒精濃度
int illumination; //光照強度
char CO; //一氧化碳濃度
int *p; // int型的指針變量
void (*fun)(); //定義一個函數指針
} sensor;
sensor sen;//結構體變量sen
sensor *Psen;//結構體指針變量Psen
int main(void)
{
Psen = &sen;//結構體指針變量指派
Psen->humidity=20;//設定結構體成員變量
printf("humidity=%d\r\n",Psen->humidity);
}
宏定義
無參宏
無參宏即宏名之後不帶參數,隻是簡單的文本替換
#define M 5 // 宏定義
#define PI 3.14 //宏定義
int a[M]; // 會被替換為: int a[5];
int b = M; // 會被替換為: int b = 5;
printf("PI = %.2f\n", PI); // 輸出結果為: PI = 3.14
有參宏
帶參數的宏定義,宏名中不能有空格,宏名與形參表之間也不能有空格,而形參表中形參之間可以有空格
輸出一個數的平方:
#define COUNT(M) M*M
int x=6;
print(COUNT(x+1));
print(COUNT(++X));
typedef
#include <stdio.h>
#include <string.h>
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
int main( )
{
Book book;
strcpy( book.title, "C 教程");
strcpy( book.author, "Runoob");
strcpy( book.subject, "程式設計語言");
book.book_id = 12345;
printf( "書标題 : %s\n", book.title);
printf( "書作者 : %s\n", book.author);
printf( "書類目 : %s\n", book.subject);
printf( "書 ID : %d\n", book.book_id);
return 0;
}
define與typedef差別
#define INT1 int *
typedef int * INT2;
INT1 a1, b1;
INT2 a2, b2;