指针运算
1、指针+-整数
2、指针-指针
3、指针的关系运算
1、指针+-整数 与3、指针的关系运算
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i< sz; i++)
{
printf("%d ", *p);
p = p + 1;
}
return 0;
}
//#include<stdio.h>
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// int* p = &arr[9];
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 10; i > 0; i--)
// {
// printf("%d ", *p);
// p = p - 1;
// }
// return 0;
//}
//公式化
#define N_VALUES 5
#include <stdio.h>
int main()
{
float values[N_VALUES];
float* vp;
for (vp = &values[0] ; vp < values[N_VALUES];)//包括了指针的关系运算
{
*vp++ = 0;//将数组中的所有元素赋值为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(char* str)
{
char* start = str;
char* end = str;
while (*end != '\0')
{
end++;
}
return end - start;
}
int main()
{
char arr[] = "bit";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
二级指针
#include<dtdio.h>
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
int*** pppa = &ppa;
***pppa = 2333;
printf("%d\n", a);
printf("%d", ***pppa);
return 0;
}
指针与数组
除去以下两种情况之外,直接引用数组名,均表示首元素地址
1、&arr-&数组名-数组名不是首元素的地址-数组名表示整个数组-&数组名取出的是整个数组的地址
2、sizeof(arr) - sizeof(数组名)-数组名表示整个数组-sizeof(数组名)计算的是整个数组的大小
数组指针----->指针
指针数组----->数组----->存放指针变量的数组
指针数组
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = { &a,&b,&c };
for (int i = 0;i < 3; i++)
{
printf("%d\n", *(arr[i]));
}
return 0;
}