指针与数组
指针减指针得到的数的绝对值是中间元素个数。
数组关系运算:(跟建议第一种写法)
#define N_VALUES 5
float values[N_VALUES];
float* vp
for(vp=&values[N_VALUES];vp>&values[0];)
{
*--vp=0;
}
for(vp=&values[N_VALUES];vp>=&values[0];vp--)
{
*vp=0;
}
当指针用于数组关系运算时,C语言标准规定,允许指向数组最后一个元素后面的那个内存位置的指针比较,但不允许与指向第一个元素之前的那个内存位置的指针比较。
#include<stdio.h>
int main(void)
{
int arr[10]={0};
printf("%p\n", arr);//地址.首元素地址
printf("%p\n", &arr[0]");
printf("%p\n", &arr"S);
return 0;
}
除了以下两种情况数组名表示的不是首元素:
1、&数组名 数组名不是首元素的地址,表示整个数组。&数组名:取出的是整个数组的地址
2、sizeof(数组名) 数组名表示整个数组 sizeof(数组名)
二级指针
#include<stdio.h>
int main(void)
{
int a=10;
int*pa=&a;
int**ppa=&pa;//ppa就是二级指针
return 0;
}
int * * ppa:第二个 * 表示ppa是指针,而前面的int * 表示指针ppa指向的类型
多级指针
和二级指针一样,如:
int***pppa:三级指针
……
指针数组
例如整形数组用于存放整形、字符数组用于存放字符,指针数组是指存放指针的数组
上代码:
#include<stdio.h>
int main(void)
{
int a=10;
int b=20;
int c=30;
int arr[3]={a,b,c};//整形数组
int* arr2[3]={&a,&b,&c};//指针数组
for(int i=0;i<3;i++)
{
printf("%d ", *(arr2[i]))
}
return 0;
}