C语言指针知识点
指针的基本概念和常见用法
* 为指针标识符。 如:*p
格式:datatype *name = value; //定义格式
int
*p; //定义,定义时必须带* 。
float *p1 = &a;
char *p2 = &c;
p1 = &b;
p2 = &d; //赋值,在定义的同时赋值需要带*,单独赋值时不能带*,因为P代表指针变量的值,即地址。*P代表指针指针变量指向的变量的值。
//P1等同于&a, &p1等同于a
//通过指针变量可以获取内存上的数据,也可以修改内存上的数据(P=&a;*p=b;)
//*p 代表的是 a 中的数据,它等价于 a,可以将另外的一份数据赋值给它,也可以将它赋值给另外的一个变量。
*
在不同的场景下有不同的作用:
*
可以用在指针变量的定义中,表明这是一个指针变量,以和普通变量区分开;
使用指针变量时在前面加
*
表示获取指针指向的数据,或者说表示的是指针指向的数据本身。
//在32位操作系统下都在0 ~ 4,294,967,295这个数区间内,所以:在32位操作系统下,任何类型的指针变量都占四个字节
---------------------------------------------------------------------------------------------------------------------------------------------
指针与数组
//数组和字符串的变量名实际上相当于其指针。在一定范围内可以认为是等同效果的,但其实质并不一样
int arr[] = { 99, 15, 100, 888, 252 };
int *p = arr;
arr 本身就是一个指针,可以直接赋值给指针变量 p。arr 是数组第 0 个元素的地址,所以int *p = arr;
也可以写作int *p = &arr[0];
。
也就是说,arr、p、&arr[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。
“arr 本身就是一个指针”这种表述并不准确,严格来说应该是“arr 被转换成了一个指针”
区别:指针是一个变量,可以进行数值运算。数组名不是变量,不可以进行数值运算。
数组指针指向的是数组中的一个具体元素(首地址),而不是整个数组,所以数组指针的类型和数组元素的类型有关,上面的例子中,p 指向的数组元素是 int 类型,所以 p 的类型必须也是int *
。
指针的优势:
指针可以直接修改指定变量的值,而不用通过函数来修改!