1. 程式人生 > >嵌入式c語言基礎 --陣列與指標

嵌入式c語言基礎 --陣列與指標

嵌入式c語言基礎
1.指標與陣列

指標是一種變數的型別,存放某一元素的地址

指標獲取陣列中的值


#include <stdio.h>

int main(void) { 
    
     int a = 10;
     int *p = &a;
     
     char ch = 'A';
     char *p_ch = &ch;
     
     printf("a:%d\n",a);
     printf("*p:%d\n",*p);   //*p 表示  p 指向的地址中存放的數
     printf("&a:%p\n",&a);   //& 取地址 符號 
     printf("p:%p\n",p);     //p是一個地址名,存放的是地址。像變數名存放變數
	 printf("&p:%p\n",&p);   // 指標本身也是變數,也需要地址存放  ,檢視存放指標變數的地址
	 printf("p+1:%p\n",p+1);  //指標的計算    加1,表示加一個int的長度 4個位元組
	 printf("p_ch:%p\n",p_ch);
	 printf("p_ch+1:%p\n",p_ch+1); //表示加一個字元char的長度,1個位元組
	return 0;
}


a:10
*p:10
&a:0x7fffa35d1b5c
p:0x7fffa35d1b5c
&p:0x7fffa35d1b60
p+1:0x7fffa35d1b60
p_ch:0x7fffa35d1b5b
p_ch+1:0x7fffa35d1b5c








2.陣列與指標    注意二維陣列的指標表示
#include <stdio.h>

int main(void) { 
    int array[10] = {0,1,2,3,4,5,6,7,8,9};
    printf("%d\n",array[0]);
    array[7] = 70;
    printf("%d\n",array[7]);
    
    printf("%p\n",array);   //陣列的地址(第一個元素的地址)
    printf("%p\n",&array[0]); //第一個元素的地址(與上一句的結果相同)
    
    printf("%d\n",*array);  //第一個地址存放的數
    
    printf("%p\n",(array+1));  //指標的計算。與下一句相同
    printf("%p\n",&array[1]);
    
    
    
    
    int array_m[3][2] = {{1,2},{3,4},{5,6}};  //  多維陣列 
    printf("%d\n",array_m);     //{1,2} 的地址  -----------------------------------------------有點暈
    printf("%d\n",*(*(array_m+1)+1));
    printf("%d\n",*(*(array_m)));
    
	
	//利用指標獲取值,總結的規律。理解不了指標就記下這些公式
    //array[n] == *(array+n);
    //array[n][m] == *(*(array+n)+m);
    //array[n][m][o] == *(*(*(array+n)+m)+o);
    

}


0
70
0x7fff66be95f0
0x7fff66be95f0
0
0x7fff66be95f4
0x7fff66be95f4
1723766224
4
1






3.陣列指標【指向一個數組的指標】   注意形式 


#include <stdio.h>
#include <stdlib.h>


//typedef int (*p_arr_t)[3];   #定義一個新的指標型別   typedef的用法



int main(void) { 

    int array[3] = {1,2,3};
    int (*p_arr)[3] = &array;//定義一個數組指標 int (*p_arr)[3]  ¥¥¥¥¥
    //int (*p_arr)[3] = array;// 陣列首元素地址 與上一句的結果相同,但是意義不同,這句表示陣列指標是錯誤的,只能用上一句
    
    //p_arr_t p_arr = &array;    //使用typedef的定義指向陣列的指標
    
    printf("%d\n",(*p_arr)[2]); //*p_arr  指向陣列 ¥¥¥¥¥

}




4.指標陣列      一個數組裡放的都是一堆指標
int main(void) { 
    int count;
    char * string[4] = {"hello worlf\n","I am\n ","who are you doing","good bay"};
    for(count=0;count<4;count++){
        
            printf(string[count]);

    }

}



hello worlf
I am
who are you doinggood bay


5.函式指標   指向函式的指標

#include <stdio.h>
#include <stdlib.h>


double Add(double a,double b) {return(a+b);};

double (*p_func)(double a,double b) = Add;

//typedef double (*p_func_t)(double a,double b);


int main(void) { 
    
    // pfunc_t p_func = Add;
    double x = 10;
    double y = 20;
    double c = 22.3;
    double d = 456.2;
    printf("%p\n",Add); // 返回函式的地址 
    printf("%lf\n",Add(x,y));
    printf("%lf\n",p_func(c,d));
    printf("%p\n",p_func);
    
   
    
    
    
}
0x40052d
30.000000
478.500000
0x40052d



6.返回指標的函式


#include <stdio.h>
#include <stdlib.h>




char *mystrcat(const char * src1, const char * src2){
    
    static char string[1000];
    sprintf(string,"%s%s",src1,src2);
    return (string);
}



int main(void) { 
	
	char * string1 = "hello";
	char * string2 = "world";
	
	printf("%s\n",mystrcat(string1.string2));
}




7.小勢力
#include <stdio.h>
#include <stdlib.h>


double Add(double x, double y){return(x+y);}
double Sub(double x, double y){return(x-y);}
double Mul(double x, double y){return(x*y);}
double Div(double x, double y){return(x/y);}


typedef double (*p_func_t)(double ,double); //定義一個指標型別


int main()
{
   /* 我的第一個 C 程式 */
   double x = 45;
   double y =55;
   int count;
	p_func_t func[4] = {Add,Sub,Mul,Div};   //指標陣列
	
	char * string[4] = {"x+y=","x-y=","x*y=","x/y="};
	
	for(count=0;count<4;count++){
		printf("%s%lf\n",string[count],func[count](x,y));
	}
   
   return 0;
}



x+y=100.000000
x-y=-10.000000
x*y=2475.000000
x/y=0.818182