#include<stdio.h>
int main()
{
int *p; //p是变量的名字,int *表示p变量存放的是int类型变量的地址, p=i是错误书写
int i=3; //int *不表明定义了一个名字叫做*p的变量
//int *p应理解为:p是变量名,p变量的数据类型是int*类型,所谓int *类型就是存放int变量
地址的类型
p=&i; //p保存了i的地址,因此p指向i 。 p不是i,i也不是p,修改p的值不影响i的值,修改i的值也不影
响p的值
return 0;
}
如果一个指针变量指向了某个普通变量,则*指针变量就完全等同于普通变量
例子:如果p是个指针变量,并且p存放了普通变量i的地址,则p指向了普通变量i
* p 就完全等同于i或者说在所有出现*p的地方都可以替换成i
在所有出现i的地方都可以替换成*p
*p就是以p的内容为地址的变量
指针就是地址,地址就是指针
地址就是内存单元的编号,指针变量是存放地址的变量
指针和指针变量是两个不同的概念
但是要注意:通常我们叙述时,会把指针变量简称为指针,实际他们含义并不一样
指针的重要性:
1.表示一些复杂的数据结构
2.快速的传递数据
3.使函数返回一个以上的值
4.能直接访问硬件
5.能够方便的处理字符串
6.是理解面向对象语言中引用的基础
指针的定义:
地址:内存单元的编号 从零开始的非负整数
指针的分类:
1.基本类型指针
#include<stdio.h>
int main()
{
int *p;
int i=3;
int j;
p=&i;
}
#include<stdio.h>
int main()
{
int i=5;
int *p;
int *q;
p=&i;
*q=p; //error语法编译会出错
*q=*p;//error
p=q; //error q是垃圾值,q赋给p,p也变成垃圾值
printf("%d\n",*q);
return 0;
}
不能完成互换功能:
#include<stdio.h>
void huhuan(int a,int b)
{
int t;
t=a;
b=t;
a=b;
return; //终止函数,互换形参结束,这个a,b的地址也结束,释放内存空间
}
int main()
{
int a=3;
int b=5;
huhuan(a,b);
printf("a=%d,b=%d\n",a,b); //互换失败
return 0;
}
void huhuan_2(int *p,int *q)
{
int t; //如果互换*p和*q的值,t必须定义成int,不能定义成int*,否则语法出错
t=*p; //p是int *, *p是int。*p代表的是以p的内容为地址的变量
*p=*q;
*q=t;
}
int main()
{
int a=3;
int b=5;
huhuan_2(&p,&q);
printf("a=%d,b=%d\n",a,b);
return 0;
}
*号的含义:
乘法
定义指针变量:int *p
指针运算符:该运算符放在已经定义好的指针变量的前面
如果p是一个已经定义好的指针变量,则*p表示指向地址的内容
指针使函数返回一个以上的值
如何通过被调函数修改为主调函数普通变量的值
1.实参必须为该普通变量的地址
2.形参必须为指针变量
3.在被调函数中通过* 形参名 的方式就可以修改主调函数相关变量的值
#include<stdio.h>
void f(int *p,int *q)
{
int t;
t=*q;
*q=*p;
*p=t;
}
int main()
{
f(&a,&b);
printf("%d %d\n",p,q);
return 0;
}
2.指针和数组的关
(1) 指针和一维数组
一维数组名:是一个指针常量,它存放的是一维数组第一个元素的地址
int a[3][4];//3行4列 a[0][0]是第一个元素
下标和指针的关系
指针+-整数:
指针类型决定了指针走一步,指针走多远(指针的步长)
int*p;--->4字节
char*p;--->1字节
double*p;--->8字节
如果p是个指针变量,则p[i]永远等价于*(p+i)
如果一个函数要处理一个一维数组,则需要接收该数组的哪些信息
需要两个参数: 1.数组第一个元素的地址 2. 数组的长度
#include<stdio.h>
void f(int* pArr,int len) //len=length数组的长度
{
int i;
for(i=0;i<len;++i)
printf("%d ",*(pArr+i)); //*pArr *(pArr+1) 分别为第一个元素地址,第二个元素地址
printf("\n");
}
int main()
{
int a[5]={1,2,3,4,5};
int b[6]={-1,-2,-3,4,5,-6};
int c[100]={1,99,22,-33};
f(a,5);
return 0;
}
指针变量运算
(2)指针和二维数组
3.指针和函数
4.指针和结构体
5.多级指针