指针加减法
指针加法:后移n个元素
指针减法:前移n个元素
int main(int argc, const char * argv[]) {
int arr[4] = {1,2,3,4};
int* p = arr;
p += 1; // 后移一个元素
printf("后移一个元素:%d \n", *p);
p -= 1; // 前移一个元素
printf("前移一个元素:%d \n", *p);
}
// 打印结果
后移一个元素:2
前移一个元素:1
指针和数组
数组名是数组的首元素地址,但它是一个常量。
int main(int argc, const char * argv[]) {
// 定义数组
int arr[] = {1,2,3,4,5};
// 打印数组a的地址
printf("arr=%p\n",arr);
// 打印数组a首元素的地址
printf("&arr[0]=%p\n",&arr[0]);
// arr = 10; // ❌ error, 数组名只是常量,不能修改
// 定义int类型指针变量p
int *p;
// 变量p里面存放的是数组的地址
p = arr;
printf("p指针:%p\n",p);
printf("arr:%p\n",arr);
// 用p指向数组中arr的任意一个元素,下面两种写法是一样的
p = arr + 3
p = &arr[3];
// 修改数组元素
arr[3] = 10;
*(arr+3) = 10;
// 遍历数组
for(int i=0; i<5; i++)
{
printf("第%d个元素:%d \n",i, arr[i]);
}
for(int* p= arr; p<arr+5; p++) // 注: arr+5
{
printf("元素:%d \n", *p);
}
// ⚠️ 使用指针访问数组元素时,不能越界
*(p + 5) = 99; // 错误❌,严重的隐患
return 0;
}
// 打印结果
a=0x7ffeefbff590
&a[0]=0x7ffeefbff590
指针数组
指针数组:它是一个数组,这个数组里的每个元素都是指针类型。
int main(int argc, const char * argv[]) {
// 指针数组
int *pArray[3];
int a1 = 1;
int a2 = 2;
int a3 = 3;
int *p1 = &a1;
int *p2 = &a2;
int *p3 = &a3;
pArray[0] = p1;
pArray[1] = p2;
pArray[2] = p3;
// 也可以直接向这样写
pArray[0] = &a1;
pArray[1] = &a2;
pArray[2] = &a3;
return 0;
}
也可以定义指针数组的同时赋值
int a1 = 1;
int a2 = 2;
int a3 = 3;
// 数组里存的元素都是地址
int *pArray[3] = {&a1, &a2, &a3};
// 获取地址对应的数据
// sizeof(pArray)/sizeof(pArray[0]) 就是计算数组中元素个数
for (int i = 0; i < sizeof(pArray)/sizeof(pArray[0]); i++) {
printf("%d\n",*pArray[i]);
}
网友评论