参考
指针详解:https://www.runoob.com/w3cnote/c-pointer-detail.html
文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一 指针的值----或者叫指针所指向的内存区或地址
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?(重点注意)
二.指针与一维数组
1.一维数组名就是就是首地址,也是第一个元素地址。
int arr[10] = {1, 2, 7, 4, 5};
int *p1 = &arr[0]; //用首元素地址
int *p2;
p2=arr; //赋值操作得到数组地址
2.指针运算,++地址增加指向类型的字节数
char a[20] = {'a', 'b', 'c', 'd', 'e', 'f'};
int *ptr = (int *)a; //强制类型转换并不会改变 a 的类型
printf("自增前*ptr:%c \n", *ptr);
ptr++; // 指向a[4]
printf("自增后*ptr:%c\n", *ptr);
*ptr = 'm'; //修改a[4]
printf("修改后*ptr:%c\n", *ptr);
printf("修改后[]4:%c", a[4]);
二.指针与二维数组
1.关于地址:
- 如a[3][4],表示三个一维数组组成(a[0],a[1],a[2])。数组名a指向第一个元素a[0]地址,而a[0]本身是一维数组名,所以a是指向地址的地址,即指向指针的指针。
int arr[2][3] = {
{1, 2, 7},
{4, 5, 6}};
int *p1 = arr[0];
int *p2 = *arr;
int *p3 = &arr[0][0];
// 第i行地址
printf("%p\n", p1);
printf("%p\n", p2);
printf("%p\n", p3);
printf("*(arr + 1):%p\n", *(arr + 1));
printf("arr + 1: %p\n", arr + 1);
printf("arr[1]: %p\n\n", arr[1]);
// 行地址 相当于数组名
int(*p)[3] = arr;
printf("p: %p\n", p);
printf("*p:%p\n", *p);
printf("*(*(p + 1) + 1) :%d\n", *(*(p + 1) + 1));
printf("**p: %d\n", **p);