天天看點

嵌入式c語言——學習筆記嵌入式c語言——學習筆記3

嵌入式c語言——學習筆記3

一、指針的運用

最普通的指針:int *a;

調用形式:

1、a——a指向的對象的位址

2、a——a指向的對象的值

3、&a——a自身的位址

常用來作為參數,調用數組,加上一個說明數組的長度的,進而擷取不定大小的數組

第二種:

int a[N] //指針數組,包含N個整型指針
           

對應地:

int (*a)[N] //數組指針,指向大小為N的數組
           

嵌入式程式設計中常見對寄存器進行讀寫的:

特别的:

*(int*)(addr)  //addr為位址,通常形式為0x00d0f110(具體位數看晶片而定);
           

數組和指針:

int num[]={1,2,3}
           

數組其實在記憶體中就是一段連續存儲的記憶體區域

數組的首位址,int *ptr=&num[0]或者int *ptr=num

char str1[]=“hello” 它的長度是5+隐藏的"\0" ,是6

char *ptr=str1;

指針的移動和減法:

隻有同類型的指針相加減才有意義

指針相減代表計算兩個指針的距離,比如相距20個位元組,int類型,就是20/4=5

int num[]={11,22,33,44,55}
int p=num;
p[3]=等價于=(p+3)
           

指針的用法:實作一個函數有多個傳回值的效果

指針變量:

指針隐含兩種東西:一個是指針變量,一個是指針常量。但是大多數情況下,指針都是指代的指針變量。

指針變量和普通變量相同,都是用于存儲資料的,隻是指針變量存放的資料很特殊,是記憶體位址。一般情況下,如果不考慮指針強制轉換的話,我們要求某個類型的位址必須放到對應的類型的指針變量中。

例如:

int a = 10;
int *p = &a;
           

指針變量的類型作用:

對于指針變量來說,其類型是由普通類型+星号構成。星号的個數表明了指針變量的級數,指針變量用來存儲位址,有如下對應關系:

1、某類型一級指針變量 = 該類型一級位址

2、某類型二級指針變量 = &(該類型以及位址)

3、n+1級指針變量 = &(n級指針變量)

需要注意的是計數超過三的時候,會降低空間的通路速度,是以過進階的指針變量是沒有太大意義。

二、結構體指針

通路結構體成員的基本方法有兩種:

1、定義一個結構體變量直接通路成員變量;

2、定義一個結構體指針變量間接通路結構體變量。

(1) 結構體變量通路:

TSCI  Sci1;

Sci1.data [ Sci1.pos++]= num;
           

(2) 結構體指針變量通路:

TSCI   *Sci2,b;

Sci2= &b;    //指針變量必須初始化    指向一個結構體變量

Sci2->data[Sci2->pos++] = num;
           

(3)(*Sci1).data    Sci2->data   效果等效

例子:

#include <stdio.h>
 
struct stu
{
    char name[20];
    long number;
    float score[4];
};
struct data
{
    int day;
    int month;
    int year;
};
 
int add(struct stu *ss1, struct stu *ss2)
{
	return ss1->number+ss2->number;
}
 
int main()
{
    struct stu *s3,*s4,s5,s6;
	//s3 = malloc(sizeof(struct stu));
	//s4 = malloc(sizeof(struct stu));
	s3 = &s5;
	s4 = &s6;
    s3->number = 1;
	s4->number = 2;
	s5.number = 3;
    printf("%d\n",s3->number);
	printf("%d\n",s4->number);
	printf("%d\n",s5.number);
	printf("%d\n",add(s3,&s5));
	printf("%d\n",sizeof(struct stu));
    return 0;
}
           

注意點:

1.定義結構體指針後,一定要給它配置設定空間,有兩種方式,一種死malloc,另一種是用一個結構體變量的位址給他指派。

2.通過結構體指針通路接頭體成員,用->;通過結構體變量通路成員,用.;并且優先級:.高于*。

3.作為函數參數時,要厘清指針還是變量。要是指針就直接傳入,要是變量就取位址&。