指针
首先我们来引入最重要的一句话来引出指针;*p p中存放的谁的地址,*p就是谁
#include <stdio.h>
int main()
{
//指针变量是用来存放地址的
int a = 10;
int* p = &a;
*p = 100; //*p = a,p中存放的是a的地址,所以*p就是a
printf("a = %d\n",a); //a = 100;
return 0;
}
运算符&
- 获取变量的地址,它的操作数必须是变量
- 地址的大小是否与int相同取决于编译器是32位还是64位
- &不能对没有地址的东西取地址
&(a+b) //×
&(a++) //×
&(++a) //×
指针变量
-
变量的是内存的地址
- 普通变量的值是实际的值
- 指针变量的值是具有实际值的变量的地址
-
*是一个单目运算符,用来访问指针的值所表示的地址上的变量
-
*可以作为右值也可以作为左值
int a = *p;
*p = a + 1;
与文章开头所描述的是一样的
那么传入函数的数组成了什么?
- 函数参数表中的数组实际上就是指针
- sizeof(a) == sizeof(int*)
- 但是可以用数组的运算符[]进行运算
- 以下四种函数原型是等价的
int sum(int *a,int n);
int sum(int *,int);
int sum(int a[],int n);
int sum(int [],int n);
- 数组变量本身表达地址,所以
- int a[5]; int* p = a;就不需要取地址符&了
- 但是数组的单元表达的是变量,需要用&取地址 a == &a[0]
- []运算符可以对数组做,也可以对指针做
- p[0] <==>a[0]
- 运算符可以对数组做,也可以对指针做
- *a = 25
- 数组变量是const的指针,所以不能被赋值
- int b [] -->int * const b;
- int b[] = a;(×)
指针计算
(一)
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int* pa = &a;
int* pb = pa;
*pb = 3;
b = 4;
printf("a = %d\n", a); //3
printf("b = %d\n", b); //4
printf("*pa = %d\n", *pa); //3
printf("*pb = %d\n", *pb); //3
pb = &b;
*pb = a;
a = 5;
printf("a = %d\n", a); //5
printf("b = %d\n", b); //3
printf("*pa = %d\n", *pa); //5
printf("*pb = %d\n", *pb); //3
*pb = *pa;
*pb = 6;
printf("a = %d\n", a); //5
printf("b = %d\n", b); //6
printf("*pa = %d\n", *pa); //5
printf("*pb = %d\n", *pb); //6
return 0;
}
(二)
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int* pa = &a;
int* pb = pa;
*pb = &b;
pb = &b;
printf("a = %d\n", a); //&b
printf("b = %d\n", b); //2
printf("*pa = %d\n", *pa); //&b
printf("*pb = %d\n", *pb); //2
b = 5;
*pa = b;
pb = b;
printf("a = %d\n", a); //5
printf("b = %d\n", b); //5
printf("*pa = %d\n", *pa); //5
printf("*pb = %d\n", *pb); //崩溃 异常
return 0;
}