STM32学习-3
下面是对c语言的稍微复习
这个是我们设置好的文件 以后拖出去用就可以了
这里加入关于指针的感想
关于指针数组和数组指针的想法
常规的东西是int a=10;
int * p=&a; (p指向了a元素,意思是p等于a的地址 类型是int*)就是 整型指针
然后我们在做别的操作时 解引用 *p 就可以改变a的值了
int main()
{
int a = 0;
int* p = &a;
*p = 1;
printf("%d\n", a);
printf("%d\n", *p);
printf("%d\n", *(&a));
return 0;
}
很明显这三个值都是1
那么接下来我介绍一个数组的概念
数组 int arr[5]={1,2,3,4,5};
数组名arr只有在计算长度size(arr)或者&arr的时候才表示整个数组的地址!!!!这个概念非常重要
现在我们先从一位数组出发
int arr[5] = { 1,2,3,4,5 };
int* p = arr;
此处的arr是什么它不属于我们上述提到的两种情况之中,所以这个名字代表的是首元素地址
int main()
{
int arr[5] = { 1,2,3,4,5 };
int* p = arr;
printf("%d\n", arr);
printf("%d\n", p);
return 0;
}
这就说明首元素地址和p值是一样的,其实他们都算是指针类型 ,指向首元素
为了确信我们修改代码再次证明
printf(“%d\n”, *arr);
printf(“%d\n”, p);发现结果是一样的说明这个arr是指针类型的一种特殊形式它正好是数组名 ,然后为了以示区分 我们才用了一个新的变量p(也是指针类型)去代替它既然理解了我上面的这段话那么下面的代码应该是相对容易的int main(){int arr[5] = { 1,2,3,4,5 };int p = arr;
printf("%d\n", *arr);//1
printf("%d\n", *p);//1
printf("%d\n", p+1);//2 先加再取地址 地址加1就是数组移到下一位printf("%d\n",
好的那么我们稍微修改一下这个代码把int p = arr;改成 int( p)[5] = &arr;先再讲述一个问题我们只讲结论&arr 表示的是整个数组的地址!!!!然后 分析int( p)[5]这句话的意思是 p是一个指针 该指针指向了一个数组,指向了一个数组,指向了一个数组,重要的话说3遍。 该数组有5个元素 每个元素类型是int 所以他叫 数组指针 !!!c语言就是这么规定的所以我写上&arr 表示整个数组的地址,这样我的指针p [5] 才能指示出arr中的全部元素!!!这样的话int p=&a; p指向了a的地址,p=a
int( p)[5] = &arr; p指向了整个数组的地址 那么同理 *p=arr *p就是数组arr 而数组arr,在我们的眼中就是首元素地址
好的接下来仅仅修改这一条语句看代码
(&arr既然是全部元素的地址,那也可以看成一个特殊的指针)!!!!
int main()
{
int arr[5] = { 1,2,3,4,5 };
int(p)[5] = &arr;//这次我们新加入的条件int q = arr;//上一个条件
printf("%d\n", *arr);//1
printf("%d\n", *q);//1 这两个都知道是首元素
printf("%d\n", arr); //首元素地址
printf("%d\n", q);//q相当于arr了 也是首元素地址
printf("%d\n", *p);//*p就是arr
printf("%d\n", &arr);//整个元素的地址但是arr数值上是首元素地址
printf("%d\n", p);//这个p也是整个数组的地址
printf("%d\n", p+1);
printf("%d\n", &arr+1);//这些与上面差了20位
printf("%d\n", arr+1);//这样就比较直观的看出 这只是差了4位
/
//得出不太恰当但好用的结论
//p=&arr *p=arr=q
printf("%d\n", *arr);
printf("%d\n", *q);
printf("%d\n", *(p));printf("%d\n",( *(&arr)));
//这四个结果都是1
printf("%d\n", *(arr+1));
printf("%d\n", *(*p+1));
printf("%d\n", *(q+1));
printf("%d\n", ((&arr)+1));
//这四个都是2
return 0;
}