嵌入式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.作為函數參數時,要厘清指針還是變量。要是指針就直接傳入,要是變量就取位址&。