#include <stdio.h>
// 1、通过指针自增的方式操作数组的每一个元素, 指针的指向发生改变
int main01()
{
int a[5] = {1,2,3,4,5};
int *p = a; // p = &a[0]
while(p < a+5)
{
printf("%d ", *p);
p ++;
}
printf("\n");
return 0;
}
//2、通过指针加上一个整数的方式遍历数组的每一个元素, 指针的指向没有发生改变
int main02()
{
int a[5] = {1,2,3,4,5};
int *p = &a[0];
for(int i=0; i<5; i++)
{
// p+i ===>表示每个元素的起始地址
// *(p+i) ====>表示每一个元素
printf("%d ", *(p+i));
}
printf("\n");
return 0;
}
//3、通过指针和下标的组合访问数组的每一个元素
#if 0
指针和数组的异同
不同点:指针是变量,可以发生改变的, 数组名是常量不可以发生改变
相同点: 如果指针指向数组的第一个元素, 指针和数组名的本质是一样的,都表示地址,
因此,数组名可以访问元素的方式指针都是支持的。
#endif
int main()
{
int a[5] = {1,2,3,4,5};
int *p = a;
for(int i=0; i<5; i++)
{
printf("%d ", p[i]);
}
printf("\n");
p = &a[2];
printf("p[0] = %d\n", p[0]);
return 0;
}
#include <stdio.h>
int main()
{
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int (*p)[4] = &a[0];// p = a;
for(int i=0; i<3; i++)
{
printf("p+%d = %p\n", i, p+i);
}
for(int i=0; i<3; i++)
{
for(int j=0; j<4; j++)
{
// p+i:每一行的起始地址
// *(p+i): 每一行第一个元素的起始地址
// *(p+i)+j: 每一行每一个元素的起始地址
// *(*(p+i)+j):每一行每一个元素
printf("*(p+%d)+%d=%p ", i, j, *(p+i)+j);
}
printf("\n");
}
for(int i=0; i<3; i++)
{
for(int j=0; j<4; j++)
{
printf("*(*(p+%d)+%d)=%d ", i, j, *(*(p+i)+j));
}
printf("\n");
}
return 0;
}