目录
一 指针 +- 整数
int main()
{
int arr[10] = { 0 };
//不使用下标访问数组
int* p = &arr[0];
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
*p = i;
p++;//p = p+1
}
p = arr;//回到初始位置
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));//p+i
}
/*for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}*/
return 0;
}
需要注意的是
int arr[10];
int * p = arr;
*(p+i) == arr[i];
*(arr+i) == arr[i]
实际上计算机在计算arr[i]的时候是转换为*(arr+i)计算的 arr为首元素地址
arr[i] == *(arr+i) == *(i+arr) == i[arr]
arr[i] --> i[arr]
[ ] 只是个操作符 i 和 arr 才是操作数
二 指针 - 指针
int main()
{
int arr[10] = { 0 };
printf("%d\n", &arr[9] - &arr[0]);//?
printf("%d\n", &arr[0] - &arr[9]);//?return 0;
}//指针 - 指针得到的数值的绝对值 是指针和指针之间的元素个数
int main()
{
int arr[10] = { 0 };
char ch[5] = {0};
//指针和指针相减的前提是:两个指针指向了同一块空间
printf("%d\n", &ch[4] - &arr[0]);//err 错误代码return 0;
//求字符串长度
//方法1
int my_strlen(char* s)
{
int count = 0;
while (*s != '\0')
{
count++;
s++;
}
return count;
}
int main()
{
char arr[10] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
//方法二
int my_strlen(char* s)
{
char* start = s;// 首元素地址放进 start
while (*s != '\0')
{
s++;
}
return s - start;//指针 - 指针
}
int main()
{
char arr[10] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
三 指针的关系运算
//地址是有大小的
//指针的关系运算就是比较指针的大小
#define N_VALUES 5
int main()
{
float values[N_VALUES];
float* vp;
for (vp = &values[N_VALUES]; vp > &values[0];)//比较指针大小
{
*--vp = 0;//先--
}
}
//简化代码
for(vp = &values[N_VALUES-1]; vp >= &values[0]; vp--)
{
*vp = 0;
}
//实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证 它可行。
//标准规定 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许 与指向第一个元素之前的那个内存位置的指针进行比较
感觉指针运算还是很容易理解的 最近太忙了没有太多时间发博客
继续加油!