上篇博客已经介绍过指针是什么,这篇简单讲解一下指针的基本运输和指针数组
目录
1、指针的基本运算
我们已经知道了指针类型决定指针允许访问空间的大小
1)指针+-整数
int main()
{
int n = 10;
char* pc = (char*)&n;
int* pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc + 1);
printf("%p\n", pi);
printf("%p\n", pi + 1);
return 0;
}
打印结果
00CFFBDC n的地址
00CFFBDC pc中存放的是a的地址
00CFFBDD pc是char*类型,所以pc+1,是地址+1,访问下一个字节
00CFFBDC pi中存放的是a的地址
00CFFBE0 pi是int类型,所以pi+1,是地址+4,跳过4个字节,访问下一个整型
2)指针的关系运算
#define N_VALUES 5
float values[N_VALUES];
//指针+-整数;指针的关系运算
int main()
{
float* vp;
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}
}
指针作比较:指针也是有大小的,有高地址和低地址之说,是地址作比较,不是数组元素比较
C语言标准规定:允许指针与指向数组的最后一个元素后面的那个地址进行比较,不允许指 向数组第一个元素前面的地址进行比较。
3)指针相减
int main() { int arr[] = { 1,2,6,7,8,9,10,11 }; int* p1 = &arr[1]; int* p2 = &arr[6] ; printf("%d", p2 - p1); }
打印结果:5
指针相减得到的是两个指针之间的元素个数,这并不是地址相减的结果。
2、二级指针
指针是用来储存地址的变量,但指针也是变量,那么谁来存放指针的的地址呢?--用二级指针来存储。
int main() { int a = 10; int* p = &a; int** prt = &p; printf("%d", **prt); }
打印结果:10
*ptr = p,*p = a;所以**ptr = a,两次解引用即可
3、字符指针
void cmp(char* m, char* n)
{
if (m == n)
{
printf("相等\n");
}
else
{
printf("不相等\n");
}
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
cmp(arr1, arr2);
char* p1 = "abcdef";//常量字符串,只会开辟一块存储空间,因为不能修改,所以是它们的
char* p2 = "abcdef";//地址相同,指向同样的内容。
cmp(p1, p2);
return 0;
}
输出结果: 不相等
相等arr1和arr2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以arr1 !=arr2。而p1和p2是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,p1和p2指向的是同一个常量字符串,所以p1 == p2。
4、指针数组
指针数组本质上是个数组,即存放指针的数组:
int arr[10] 整型数组
char arr[10] 字符数组
int * arr[10] 指针数组
如何使用指针数组:
int main()
{
int arr1[] = { 1,2,3,4,5,};
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
//arr是指针数组
int* arr[] = { arr1,arr2,arr3 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
//printf("%d ", arr[i][j]);
printf("%d ", *(arr[i] + j));
}
printf("\n");
}
return 0;
}
输出结果;
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
是不是类似一个二维数组?
我们知道数组名一般情况下是数组首元素地址,当访问到arr[0]的时候就是arr[]中的第一个元素arr1了,arr1数组名就是数组arr1的首元素地址,arr1[0]的地址,如果arr[0]+1就访问到arr1[1]的地址,解引用后就是2。*(*arr[0]+1) = arr[0][1]。
数组实际上就是指针的操作,*(arr[0]+1) = arr[0][1] 有可能有点难以理解,举个例子,如果是一维数组,即p[0] = *(p+0),如果是p+1则访问p[1], 即地址+1,就跳过一个整型元素,访问下一个元素。
下列代码输出结果为:1
int main()
{
int p[] = { 1,2,3,4 };
printf("%d", *(p + 0));
return 0;
}
指针在数组上的运算尤为重要,他现了C语言的灵活性。