1. 定义一个指针变量指向数组(69.6.7)
2. 指针偏移遍历数组(70.6.8)
3. 指针偏移的补充,记得回到数组首地址(71.6.9)
#include <stdio.h>
int main()
{
int arr[3] = {1,2,3};
int *p;
p = arr;
printf("首元素是:%d\n",*arr);
printf("首元素是:%d\n",*p);
for(int i = 0; i<3; i++){
printf("%d ",*p);
p++;
}
putchar('\n');
p = arr;
for(int i = 0; i<3; i++){
printf("%d ",*p++);
}
return 0;
}
4. 指针和数组名的见怪不怪,重要面试(72.6.10)
- demo_pointerArrStrange.c 指针变量的几种见怪不怪的写法
#include <stdio.h>
int main()
{
int arr[3] = {1,2,3};
int *p = arr;
printf("sizeof arr is %d\n",sizeof(arr));
printf("sizeof arr is %d\n",sizeof(p));
printf("sizeof int is %d\n",sizeof(int));
printf("sizeof pointer is %d\n",sizeof(int*));
printf("sizeof pointer is %d\n\n",sizeof(char *));
printf("%d \n",p[2]);
printf("%d \n",*arr);
printf("%d \n\n",*p);
for(int i = 0; i<3; i++){
printf("%d ",p[i]);
}
printf("\n\n");
for(int i = 0; i<3; i++){
printf("%d ",*(arr+i));
}
putchar('\n');
return 0;
}
5. 练习函数指针数组结合(73.6.11)
#include <stdio.h>
void initArray(int *parr, int size)
{
int i;
for(i=0;i<size;i++){
printf("请输入第%i个元素的数据:\n",i+1);
scanf("%d",parr++);
}
}
void printArray(int *parr, int size)
{
int i;
for(i=0;i<size;i++){
printf("%d ",*parr++);
}
}
int main()
{
int array[5];
int size = sizeof(array)/sizeof(array[0]);
initArray(array,size);
printArray(&array[0],size);
return 0;
}
6. 练习之数组翻转(74.6.12)
7. 二维数组的地址认知,很猛(75.6.13)
8. 认知继续(76.6.14)
- demo_ex2_reversed.c 练习指针的写法
#include <stdio.h>
void initArray(int *parr, int size)
{
int i;
for(i=0;i<size;i++){
printf("请输入第%i个元素的数据:\n",i+1);
scanf("%d",parr++);
}
}
void revangeArry(int *parr, int size)
{
int i,j;
int temp;
for(i=0;i<size/2;i++){
j = size-1-i;
temp = *(parr+i);
*(parr+i) = *(parr+j);
*(parr+j) = temp;
}
}
void printArray(int *parr, int size)
{
int i;
for(i=0;i<size;i++){
printf("%d ",*parr++);
}
putchar('\n');
}
int main()
{
int array[5];
int size = sizeof(array)/sizeof(array[0]);
initArray(array,size);
printArray(&array[0],size);
revangeArry(array,size);
printArray(&array[0],size);
return 0;
}
9. 通过编程验证认知(77.6.15)
- demo_doubleArrayPointer.c arr[1]+2 == *(arr+1)+2
#include <stdio.h>
int main()
{
int arr[3][4] = {{11,20,33,44},{12,13,15,16},{22,66,77,88}};
printf("arr是父亲地址:%p,偏移1后是%p\n",arr, arr+1);
printf("arr是父亲地址:%d,偏移1后是%d\n\n",**arr, **(arr+1));
printf("arr[0]是子数组地址;%p,偏移1后是%p\n",arr[0],arr[0]+1);
printf("arr[0]是子数组地址;%p,偏移1后是%p\n",*(arr+0),*(arr+0)+1);
}
10. 二维数组的地址写法应用(78.6.16)
- demo_doubleBianli.c 嵌入式工程师的笔试题必考题
#include <stdio.h>
int main()
{
int arr[3][4] = {{11,20,33,44},{12,13,15,16},{22,66,77,88}};
int i;
int j;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("add:0x%p,data:%d \n",&arr[i][j],arr[i][j]);
printf("add:0x%p,data:%d \n",arr[i]+j,*(arr[i]+j));
printf("add:0x%p,data:%d \n",*(arr+i)+j,*(*(arr+i)+j));
printf("===========================================\n");
}
putchar('\n');
}
return 0;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/53a7af34efa4497aafc1d0a60c31391d.png)