天天看點

【嵌入式C】指針!指針指針的聲明結構體指針宏定義

指針

每一個變量都有一個記憶體位置,每一個記憶體位置都定義了可使用 & 運算符通路的位址,它表示了在記憶體中的一個位址。

指針也就是記憶體位址,指針變量是用來存放記憶體位址的變量。

指針的聲明

int    *ip;    /* 一個整型的指針 */
double *dp;    /* 一個 double 型的指針 */
float  *fp;    /* 一個浮點型的指針 */
char   *ch;    /* 一個字元型的指針 */
           

注:所有實際資料類型,不管是整型、浮點型、字元型,還是其他的資料類型,對應指針的值的類型都是一樣的,都是一個代表記憶體位址的長的十六進制數。不同資料類型的指針之間唯一的不同是,指針所指向的變量或常量的資料類型不同。

使用指針

使用指針時會頻繁進行以下幾個操作:定義一個指針變量、把變量位址指派給指針、通路指針變量中可用位址的值

【嵌入式C】指針!指針指針的聲明結構體指針宏定義
#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);}
           
【嵌入式C】指針!指針指針的聲明結構體指針宏定義

上面的例子相當于将結構體中的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);

}
           
【嵌入式C】指針!指針指針的聲明結構體指針宏定義

宏定義

【嵌入式C】指針!指針指針的聲明結構體指針宏定義

無參宏

無參宏即宏名之後不帶參數,隻是簡單的文本替換

#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;
           

繼續閱讀