目录
目录
2.使用方法
一.指针运算
1.指针的加减运算
int main(){
int a[10] = { 1,2,3,4,5,6,7,8,9,10};
int i = 0;
int sz = sizeof(a) / sizeof(a[0]);
int* p = a;//利用指针遍历数组
for (i = 0; i < sz; i++) {
printf("%d ", *p);
p = p + 1;//指针加
}
return 0;
}
上面的代码是让指针指向数组a,此时指针指向的是数组首元素的地址, 通过循环的方式指针每输出一次,就让指针指向下一个元素的地址,从而遍历完整个数组。
注意:*p是地址对应数组里边的值,p则单纯是指地址。
2.指针减指针运算
int arr[10] = { 0 };
printf("%d\n", &arr[9] - &arr[0]);//?
printf("%d\n", &arr[0] - &arr[9]);//?
以上代码表示:创建了一个拥有10个元素的数组,然后相互计算起始位置的元素与末尾位置的元素互相减去的结果 。
代码结果:两指针(指向首元素的地址与指向末尾元素的地址)相减的结果其实是指针之间的元素个数。所以上面两行的代码值为9与-9。
我们可以通过结果看出,末尾元素 ——起始元素的值为正数,而起始元素——末尾元素的值则相反。计算指针与指针之间的关系运算:1.必须是遵循大地址——小地址(否则为负数);
2.只能是计算指针之间的减法;3.必须是同一数组间才能进行指针相减运算(下图为相反的例子,结果出错)。
int my_strlen(char* str)
{
char* start = str;//首元素地址
while (*str != '\0')//最终str会到末尾
{
str++;
}
return (str - start);
}
上图代码也是末尾指针减起始指针。
二.指针遍历数组
int main()
{
int arr[10] = {0};
//arr 是首元素的地址
//&arr[0]
int* p = arr;
//通过指针来访问数组
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%p ----- %p\n", &arr[i], p + i);
}
return 0;
}
1. 所以 p+i 其实计算的是数组 arr 下标为i的地址。
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i<sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
2. 那么p+i通过解引用操作就可以变成arr[i] 元素的值 。
通过以上两个例子可得指针与数组的等价关系:
arr[i]<==>*(p+i)<==>*(arr+i)
p+i <==> arr+i <==> &arr[i]
三.二级指针
在之前,我所讲的所有指针都是一级指针,如下图,是一级指针的使用方法。一级指针就是创建指针变量去关联变量的地址,从而间接影响变量的值。
int a = 10;
int* pa = &a; //取地址
*pa = 20; //解引用
printf("%d\n", a);
那么指针变量也是变量的一种表示形式,是变量就会有地址。那我们就可以使用指针变量去关联指针变量的地址,由此衍生出来二级指针。(说白了就是套娃操作!hhh)
int a = 10;
int* pa = &a;
int** ppa = &pa;
**ppa = 200;
printf("%d\n", a);
如右图:一级指针pa存放变量a的地址,二级指针ppa存放一级指针变量pa的地址。
解析指针语句:int* pa中,pa是变量名,*号表示指针,int是说pa指向的对象类型是int型。
int* * ppa中,ppa是变量名,第二个指针表示ppa是指针,而int*表示ppa指向的对象类型是int*类型的。
二级指针的运算:
**ppa=200;其实可以写成 *(*pa)=200;
*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .
以上就是二级指针的讲解。
四.指针数组
1.定义
指针数组说白了就是数组,就好比好孩子,主语是孩子。指针只是形容词,指针数组就表明数组中存放的全是指针类型的元素。
上图为普通数组的存放方式,通过创建一个数组,将其三个变量放在数组中。那么指针数组也是如此。如下图:
int main()
{
int a = 10;
int b = 20;
int c = 30;
int arr[10];
int* pa = &a;
int* pb = &b;
int* pc = &c;
//parr就是存放指针的数组
//指针数组
int* parr[10] = { &a, &b, &c };
int i = 0;
for (i = 0; i < 3; i++)//0 1 2
{
printf("%d ", *(parr[i]));
}
return 0;
}
2.使用指针数组去转换二维数组
int main() {
int a1[] = { 1,2,3,4 };
int a2[] = { 2,3,4,5 };
int a3[] = { 3,4,5,6 };
int* par[] = { a1,a2,a3 };//使用指针数组去接收三个数组,a1,a2,a3指向的都是各数组的首元素地址
int i = 0;
printf("par[]:\n");
for (i = 0; i < 3; i++) {
int j = 0;
for (j = 0; j < 4; j++) {
printf("%d ", par[i][j]);
}
printf("\n");
}
return 0;
}
关于指针,我就讲到这里了,觉得有用的话,点个关注吧! 谢谢