嵌入式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