4、指针运算
1、指针+-整数,举个栗子:
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int* p = arr;
for (i = 0; i < 10; i++)
{
printf("%d ", *p);
p=p + 1;
}
return 0;
}
2、指针-指针,举个栗子:
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", & arr[9] - &arr[0]);
return 0;
}//应该会得到什么结果呢?
我们会发现指针-指针得到的是指针之间元素的个数(必须是大地址-小地址,小地址-大地址的绝对值则是指针元素之间的个数)
练习:模拟实现求字符串长度
#include<stdio.h>
int my_strlen(int* str)
{
char* start=str;
char* end=str;
while(*end!='\0')
{
end++;
}
return end-start;
}
int main()
{
char arr[]="hello";
int len=my_strlen(arr);
printf("%d\n",len);
return 0;
}
3、指针的关系运算(比较大小)
for(vp=&values[N_VALUES];vp>&values[0])
{
*--vp=0;
}
代码简化,将代码修改如下:
for(vp=&values[N_VALUES-1];vp>=&values[0];vp--)
{
*vp=0;
}
第二种方法在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证他可行。
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
5、指针和数组
数组名是什么?举个栗子:
但并不是所有时候数组名都表示首元素地址:
1、&arr-数组名不是首元素地址-数组名表示整个数组-&数组名取出的是整个数组的地址
2、sizeof(arr)-sizeof(数组名)-数组名表示整个数组-sizeof(数组名)计算的是整个数组的大小
既然可以把数组名当地址存放到一个指针中,我们使用指针来访问就成为可能。
例如:
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("arr[%d]=%p<===>p+%d=%p\n", i, &arr[i], i, p + i);
}
return 0;
}
所以说p+i其实计算的就是数组arr下标为i的地址(通过指针我们可以访问数组,但二者并不相同,数组中可以存放一组相同类型数据,但指针只能存放一个地址)
6、二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是二级指针
#include<stdio.h>
int main()
{
int a=10;
int* pa=&a;//一级指针
int* * ppa=&pa;//二级指针
return 0
}
7、指针数组
指针数组是指针还是数组?
是数组。是存放指针的数组。
数组我们已经知道整型数组,字符数组。而数组指针则是指针。
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int c=30;
//int* pa=&a;
//int* pb=&b;
//int* pc=&c;
//整型数组-存放整型
//字符数组-存放字符
//指针数组-存放指针
//int arr[10];
int* arr[3]={&a,&b,&c};//指针数组
int i=0;
for(i=0;i<3;i++)
{
printf("%d\n",*(arr[i]));
}
return 0;
}
指针初阶的内容我们就暂时讲到这里,后面我会更新指针进阶。相信大家观看后也一定会有所收获。感谢大家的观看及关注!