指针的定义还有一系列什么的我都不多说啦。老生常谈,就是因为看不懂才来看的。接下来我直接用几个实例来为你们解释什么是指针。
*****************************************正文开始*********************************************
定义指针(标准形式):
标准的定义一个指针的形式如下:
#include<stdio.h>
int main()
{
int a = 9, *p;
p = &a;
*p = a;
printf("p=%p\n*p=%d", p, *p);
}
结果如下:
因此我们得到 结论 (p和*p的区别):
int *p,相当于 定义 了一个 指针变量 。定义之后,p就是一个 指针变量(也可以理解为一个地址变量)。而 *p 则是通过 地址变量(p) 中 存储的地址 去 间接的 访问到这个地址中的值(可以理解为*p里面存储了一个值(严格意义上说不是,但你先这个理解))。
*****************************************分割线*********************************************
定义一个swap()函数用于交换两个数的值
#include<stdio.h>
void swap(int* a, int* b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
int main()
{
int a = 2, b = 9;
swap(&a, &b);
printf("调用swap()后\na=%d\nb=%d", a, b);
}
利用 结论 的知识也就是为什么你定义一个void swap(int *a,int *b)函数用于交换两个参数的值的时候,往里边传入实参的方式是swap(&a,&b)。运行结果是正确的(a变为了9,b变为了2),我就不给你们看了。
*****************************************分割线*********************************************
接下来给你们讲一个小知识点。我们都知道,数组名本身其实就是一个地址,里面存放的地址是与第一个元素的地址是相同的。验证如下
#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6};
int * p1, * p2;
p1 = arr;
p2 = &arr[0];
printf("p1=%p\np2=%p", p1, p2);
}
运行结果如下:
得证;
拓展,为什么这样呢,为什么要让数组名本身就是一个地址呢?因为在c语言中。来取数组中的值就是这么操作的。我们知道数组中的元素之间的地址是紧挨着的。因此如果要去取一个数组中位于第二个位置的元素,C语言的计算方法就是,,要取的元素的地址 = 数组名起始地址+根据指针类型而定的字节数*元素的下标(或称为索引),从而确定的。