指针
#include <stdio.h>
/*
指针:本质是一个变量,用于存储另一个变量(比如变量b)的内存地址,
既然是变量,就有值,其值就是变量b的内存地址,
我们知道,可以使用连字号&来获取一个变量的内存地址,比如&b表示变量b的内存地址
而使用星号*指针的形式可以获取变量b的值,如下实例所示:
*/
int main()
{
int a = 10; // 声明一个变量
int *ip; // 声明一个指针
ip = &a; // 使用指针ip来存储变量a的内存地址
printf("变量a的内存地址是:%p \n", &a); // 变量a的内存地址
printf("指针ip的值是:%p \n", ip); // 指针ip的值
printf("通过指针获取变量a的值:%d \n", *ip); // 通过指针获取变量的值
printf("指针ip的内存地址:%p \n", &ip); // 获取指针的内存地址
// 结束main函数
return 0;
}

指针可以进行算术运算:
/* 使用指针存储数组的内存地址,并使用指针表示数组的值 */
#include <stdio.h>
const int MAX = 3;
int main()
{
int dat[] = {10, 20, 30};
int i, *ptr;
// 这里直接把数组名赋值给指针ptr,也即数组的第一个元素的地址赋值给指针的意思,没写就默认是数组的第一个元素的地址
ptr = dat; // 或者:ptr = &dat[ 0 ]; 表示指针指向数组的第一个元素的内存地址
for(i=0; i<MAX; i++)
{
printf("存储地址:\t dat[ %d ] = %x \n", i, ptr);
printf("存储值:\t dat[ %d ] = %d \n", i, *ptr);
/* 移动到下一个位置 */
ptr++;
}
// 结束main函数
return 0;
}

另一种方法:
/* 使用指针存储数组的内存地址,并使用指针表示数组的值 */
#include <stdio.h>
const int MAX = 3;
int main()
{
int dat[] = {10, 20, 30};
int i, *ptr;
ptr = &dat[ MAX - 1 ];
for(i=MAX; i>0; i--)
{
printf("存储地址:\t dat[ %d ] = %x \n", i-1, ptr);
printf("存储值:\t dat[ %d ] = %d \n", i-1, *ptr);
ptr--;
}
// 结束main函数
return 0;
}

十六进制数28ff34转十进制数是:2686764
十六进制数28ff30转十进制数是:2686768
十六进制数28ff2c转十进制数是:2686772
所以,指针每递增一次,就+4,同一个数组中的元素的内存地址是连续分配的,中间不会被其他元素地址隔开,所以通过自增或自减就可以获取数组中所有元素的地址

浙公网安备 33010602011771号