|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Julia999 于 2019-7-31 20:40 编辑
- #include<stdio.h>
- int main()
- {
- int *p; //p是个变量名字,int *表示该p变量只能存储int类型变量的地址
- int i=10;
- int j;
- //j=*p; //错误 野指针
- return 0;
- }
复制代码 指针的定义:
地址:内存单元的编号(从0开始的非负整数)
范围:0----FFFFFFFF【0-4G-1】
指针:指针就是地址,地址就是指针
指针变量就是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
分类:
1.基本类型的指针
2.指针和数组的关系
基本概念:
- int i=10;
- int *p=&i; //等价于int *p; p=&i;
复制代码
详解这两部操作:
1)p存放了i的地址,所以我们说p指向了i
2)p和i是完全不同的两个变量,修改其中的任意一个变量不改变另外一个
3)p指向i,*p就是i变量本身。更加形象的说就是所有出现*p的地方都可以换成i
注意:
指针变量也是变量,只不过他存放的不能是内存单元的内容,只能存放内存单元的地址
普通变量前面不能加*
常量和表达式前不能加&
区分:
- #include<stdio.h>
- void f(int i)
- {
- i=100;
- }
- int main()
- {
- int i=9;
- f(i);
- printf("%d:",i);
- return 0;
- }
复制代码 上面这个是不能改变i的值的,最后的输出结果仍然是9。因为本质上,这样的操作并不能对i进行修改。
- #include<stdio.h>
- void f(int *i) //不是定义了一个名字叫做*i的形参,而是定义了一个形参,该形参的名字叫做i,他的类型是int *
- {
- *i=100;
- }
- int main()
- {
- int i=9;
- f(&i);
- printf("%d:",i);
- return 0;
- }
复制代码
如何通过被调函数修改主调函数中的普通变量的值
1.实参为相关变量的地址
2.形参为以该变量的类型为类型的指针变量
3.在被调函数中通过 *形参变量名 的方式就可以修改主函数中的变量
指针和数组:
指针和一维数组:
数组名
一维数组名是个指针常量
他存放的是一维数组第一个元素的地址
他的值不能被改变
一维数组名指向的是数组的第一个元素
下标和指针的关系:
a<-->&=*(a+1)
- #include<stdio.h>
- int main()
- {
- int a[5]={1,2,3,4,5};
- //a[3]=*(a+3);
- print("%p\n",a+1);
- print("%p\n",a+2);
- print("%d\n",*a+3); //*a+3等价于a[0]+3 =4
- return 0;
- }
复制代码
- #include<stdio.h>
- void Show_Array(int *p,int len)
- {
- //p[2]=-1;
- //p[i]就是主函数a[i]
- for(int i=0;i<len;i++)
- {
- printf("%d\n",p[i]);
- }
- }
- int main()
- {
- int a[5]={1,2,3,4,5};
- Show_Array(a,5); //a等价于&a[0],&a[0]本身就是int *类型
-
- return 0;
- }
复制代码
如果通过被调函数修改主调函数中一维数组的内容【如何界定形参中的两个参数】存放数组首元素的指针变量
存放数组长度的整型变量
- #include<stdio.h>
- int main()
- {
- double *p;
- double x=66.6;
- p=&x; //x占8个字节,1个字节是8位,1个字节一个地址
-
- double arr[3]={1.1,2.2,3.3};
- double *q;
- q=&arr[0];
- printf("%p\n",q); //%p实际就是十六进制输出
- q=&arr[1];
- printf("%p\n",q);
- return 0;
- }
复制代码
|
|