指针的概念
- 指针其实就相当于门牌,一个数据或者字节的存在,既有它的值,又有它的地址,跟酒店开房是一样的。
&和*
- 取地址运算符&:单目运算符&是用来取操作对象的地址。
-
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。
-
有个很有意思的东西x=*&x,两个运算符互逆,一通操作的结果就是x=x。
-
最后,也是我经常分不清的,int *pa;该式子已经定义了pa为指针变量,之后使用pa=&a时,注意pa与*pa不一样。
-
#include<stdio.h> int main(){ int *a; int b=2; a=&b;//获取b的地址 print("%p",a);//输出a代表的地址 print("%d",*a);//输出b的值 return 0; }
结合方向
- 两者皆为向右结合
指针运算
- 指针加减运算:int px; px+1=px下一位的地址。
- 关系运算
-
px > py 表示 px 指向的存储地址是否大于 py 指向的地址;
px == py 表示 px 和 py 是否指向同一个存储单元;
px == 0 和 px != 0 表示 px 是否为空指针;
指针与数组
- Int *p,a【10】;P=num;与p=&num【0】;表达一致,都指向数组首位。
- *p=1,相当于为num【0】赋值
-
P+1,即地址向后移动一位,即num【1】
P+x同理,注意边界
动态分配内存
malloc函数:
- 头文件#include<stdib.h>
- malloc自身为void类型函数,注意使用时的类型转换
- malloc申请的空间是字节为单位(如:一个int四个字节,char一个字节)
- 注意申请完内存后要进行释放,使用函数free()
- 运行函数的过程中,当没有空间时,则申请失败返回0或者NULL。
-
#include<stdio.h> #include<stdlib.h> int main(){ int n=2; int a*; int i; int d[]; a=(int*)malloc(n*sizeof(int);) for(i=0;i<7;i++){ scanf("%d",&a[i]); } //利用a的动态内存分配输入 for(i=0;i<7;i++){ scanf("%d",&d[i]); } //数组输入 for(i=0;i<7;i++){ printf("%d\n",a[i]); } //a的输出 for(i=0;i<7;i++){ printf("%d\n",a[i]); } //数组输出 //释放内存 free(a); retiurn 0; }