指针
在学c语言的时候对于指针这块儿就一直没弄明白,下面是我看郝斌老师视频的一些总结
1.1 指针和指针变量
- 指针就是地址,地址就是指针
- 指针变量是存放地址的变量
- 指针的本质是一个操作受限的非负整数
- 指针和指针变量是两个不同的概念
- 但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样
- 地址:
(1)地址就是内存单元的编号
(2)从0开始的非负整数
(3)范围:0–FFFFFFFF【0-4G-1】
# include <stdio.h>
int main(void)
{
int * p; //p是变量的名字, int * 表示p变量存放的是int类型变量的地址
//int * p; 不表示定义了一个名字叫做*p的变量
// int * p; 应该这样理解: p是变量名, p变量的数据类型是 int *类型
// 所谓int * 类型 实际就是存放int变量地址的类型
int i = 3;
int j;
p = &i;
/*
1. p保存了i的地址, 因此p指向i
2. p不是i,i也不是p,更准确的说: 修改p的值不影响i的值,修改i的值也不会影响p的值
3. 如果一个指针变量指向了某个普通变量, 则
*指针变量 就完全等同于 普通变量
例子:
如果p是个指针变量,并且p存放了普通变量i的地址
则p指向了普通变量i
*p 就完全等同于 i
或者说: 在所有出现*p的地方都可以替换成i
在所有出现i的地方都可以替换成*p
*p 就是以p的内容为地址的变量
*/
j = *p; //等价于 j = i;
printf("i = %d, j = %d\n", i, j);
return 0;
}
1.2 实现两个数交换
# include <stdio.h>
void huhuan_1(int , int);
void huhuan_2(int *, int *);
void huhuan_3(int *, int *);
int main(void)
{
int a = 3;
int b = 5;
huhuan_3(&a, &b); //huhuan_2(*p, *q); 是错误的, huhuan_2(a, b);也是错误的
printf("a = %d, b = %d\n", a, b);
return 0;
}
//不能完成互换功能
void huhuan_1(int a, int b)
{
int t;
t = a;
a = b;
b = t;
return;
}
//不能完成互换功能
void huhuan_2(int * p, int * q)
{
int * t;//如果要互换p和q的值,则t必须是int *,不能是int,否则会出错
t = p;
p = q;
q = t;
}
//可以完成互换功能
void huhuan_3(int * p, int * q)
{
int t; //如果要互换*p和*q的值, 则t必须定义成int,不能定义成int *, 否则语法出错
t = *p; //p是int *, *p是int
*p = *q;
*q = t;
}
1.3 关于指针常见的错误
# include <stdio.h>
int main(void)
{
int * p; //p是变量的名字, int * 表示p变量存放的是int类型变量的地址
int i = 3;
p = &i; //OK
//p = i; //error,因为类型不一致,p只能存放int类型变量的地址,不能存放int类型变量的值
//p = 55; //error 原因同上
return 0;
}
# include <stdio.h>
int main(void)
{
int i = 5;
int * p;
int * q;
p = &i;
//*q = p; //error 语法编译会出错
//*q = *p; //error
p = q; //q是垃圾值,q赋给p, p也变成垃圾值
printf("%d\n", *q); //13行
/*
q的空间是属于本程序的,所以本程序可以读写q的内容,
但是如果q内部是垃圾值,则本程序不能读写*q的内容
因为此时*q所代表的内存单元的控制权限并没有分配给本程序
所以本程序运行到13行时就会立即出错
*/
return 0;
}
2.1 指针和一维数组
数组名:
一维数组名是个指针常量
它存放的是一维数组第一个元素的地址
它的值不会被改变
一维数组名指向的是数组的第一个元素
下标和指针的关系:a[i] ---------->> *(a+i)
指针变量的运算:
指针变量不能相加,不能相乘,不能相除
如果两指针变量属于同一数组,则可以相减
想要遍历数组,只需要知道数组的首地址和数组的长度
【举例】
如何通过被调函数修改主调函数中一维数组的内容:两个参数
- 存放数组首元素的指针元素
- 存放数组元素长度的整形变量
#include <studio.h>
void Show_Array(int * p,int len)
{
int i = 0;
for(i=0;i<len;++i)
printf("%d\n",p[i]); //p[i]就是主函数的a[i]
// p[0] = -1;//p[0]==*p p[2]==*(p+2)==*(a+2)==a[2]
}
int main(void)
{
int a[5]={1,2,3,4,5};
Show_Array(a,5);//a等价于&a[0],&a[0]本身就是int *类型
// printf("%d\n",a[0]);//a[2]==-1
return 0;
}