指针是什么?
内存
在计算机中,内存就相当于一条长长的街道。街道两旁住了很多人家,每个人家都有自己的门牌号,门牌号就相当于他们家的地址,并且地址是唯一的。
指针
指针是个变量,通过它能找到以它为地址的内存单元。
#include<stdio.h>
int main()
{
int a = 10;
int *p = &a;//取出a的地址
//地址存放在对应类型的指针当中
printf("%d\n", a);
printf("%d\n", p);
return 0;
}
总结:
- 指针就是变量,用来存放地址的变量。(存放在指针当中的值都被当成地址处理)。
- 指针是用来存放地址的,地址是唯一标示一块地址空间的。
- 指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针和指针类型
指针就是变量,变量有不同的类型。指针的定义方式是: ** type + **
char *pc = NULL; //char* 类型的指针是为了存放 char 类型变量的地址。
int *pi = NULL; //int* 类型的指针是为了存放 int 类型变量的地址。
short *ps = NULL; //short* 类型的指针是为了存放 short 类型变量的地址。
long *pl = NULL; //long* 类型的指针是为了存放long类型变量的地址。
float *pf = NULL; //float* 类型的指针是为了存放floaat类型变量的地址。
double *pd = NULL;//double*类型的指针是为了存放double类型变量的地址。
指针和指针类型的意义:
总结:
- 指针的类型决定了指针向前或者向后走一步有多大(距离)。
- 指针的类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。 比如:char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
二级指针
指针的变量也是变量,是变量就有地址,指针变量的地址存放在 二级指针中。
对于二级指针的运算有:
- ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .
int b = 20;
*ppa = &b;//等价于 pa=&b;
- **ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .
**ppa=30;
//等价于*pa=30;
//等价于a=30;
指针运算
指针±整数
#define N 5
int main()
{
float a[N];
float *p;
for (p = &a[0]; p < &a[N];)
{
*p++ = 0;
}
return 0;
}
- 指针±整数 ,标准定义这种形式只能用于指向数组中某个元素的指针。
- 并且这类表达式的结果类型也是指针
- 对一个指针加1使它指向数组中的下一个元素,加5使它向右移动5个元素的位置,依次类推。把一个指针减去3使它向左移动3个元素的位置。
指针-指针
int main()
{
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 ,10};
int *p = &a[3];
int *t = &a[7];
printf("%d\n", *p - *t);//-4
return 0;
}
- 只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针
- 两个指针相减的结果的类型是ptrdiff_t,它是一种有符合整数类型。减法运算的值是两个指针在内存中的距离是指针的本身(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。
- 如果两个指针所指向的不是同一个数组中的元素,那么它们之间相减的结果是未定义的。程序员无从知道两个数组在内存中的相对位置,如果不知道这一点,两个指针之间的距离就毫无意义。
指针的关系运算
前提是它们都指向同一个数组中的元素
int main()
{
float a[N];
float *p;
for (p = &a[N - 1]; p >= &a[0]; p--)
{
*p = 0;
}
return 0;
}
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个 元素之前的那个内存位置的指针进行比较。
指针和数组
数组名是什么?我们看一个例子:
可见数组名和数组首元素的地址是一样的。
结论:数组名表示的是数组首元素的地址。
既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;//p存放的是数组首元素的地址
通过指针来访问数组
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i<sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
输出 1 2 3 4 5 6 7 8 9 0