您的位置:首页 > 编程语言 > C语言/C++

——黑马程序员——C语言中的指针(一)

2015-11-03 10:30 369 查看
-----------android培训java培训、java学习型技术博客、期待与您交流!-----------
C语言中的指针(一)

一、定义

指针:内存单元的编号或者地址称为指针,指针是一个地址,因此指针是常量
指针变量:专门用来存放另一个变量地址的变量,指针变量的值是地址,它可以存放不同的地址,因此指针变量是变量
定义指针变量:
类型名  * 指针变量名; 例如: int *p;
其中 * 表示是一个指针变量,表示改指针变量指向的数据类型是整型

特点:1、多个指针可以指向同一个地址
   2、指针指向可以改变的
   3、指针没有初始化时,指针的值是垃圾值,称野指针
注意:1、在定义时,* 表示定义的变量是指针变量,变量的值只能存放地址
   2、一个类型的指针只能指向相同类型的变量,不能指向其他类型的变量
   3、指针变量可以声明为全局、静态局部或局部

二、指针变量初始化

1、定义的同时进行初始化
int *p = &a;
2、定义的同时部分初始化
int *p1 = &a,*p2;
     *p2 = &a;
p1和p2同时都指向了a 
3、初始化为NULL
int *p = NULL;//本质是为0
int *p = 0;//和NULL效果一样
p指向了空
4、先定义后初始化(不建议使用)

int *p4 ;
     *p4 = &a; //先定义后初始化

三、指针的应用

1、例如:用指针实现两个数的交换
测试代码:
<span style="font-size:14px;">#include <stdio.h>
#include <stdlib.h>
int main()
{
//用指针实现:输入两个整数,按先大后小的顺序输出
//定义两个指针
int *p1, *p2, *p;
//定义两个变量
int  a, b;
//提示用户输入
printf("请输入两个整数\n");
//接收键盘输入的数
scanf("%d%d",&a,&b);
//让指针p1指向a的地址
p1 = &a;
//让p2指向b的地址
p2 = &b;
//判断两个数的大小
if(a < b)
//将a和b的值进行交换
{
//让p和p1所指的地址,即p指向了a的地址
p = p1;
//让p1指向p2所指向的地址,即p1指向了b的地址
p1 = p2;
//让p2指向p所指向的地址,即p2指向了a的地址
p2 = p;
}
//输出a和b的值
printf("a = %d	b = %d\n",a,b);
//输出p1和p2所指向的地址的值
printf("Max = %d  Min = %d\n",*p1, *p2);
system("pause");
return 0;
}</span>



利用函数无法完成上面所提出的需求,因为调用函数的时候系统分配的存储空间在函数调用完成之后就会全部释放,无法主函数中a和b的值无法改变
2、在被调函数中可以修改主调函数的变量
#include <stdio.h>
#include <stdlib.h>
//定义一个函数
void changeValue(int *p){
//将100赋值给指针p所指向的地址内容
*p = 100;

}
int main()
{
int a = 1;
//定义一个指针并指向a
int *p1 = &a;
//打印a的地址
printf("%p\n",&a);
printf("%p\n",p1);

//打印出a的值
printf("%d\n", a);
printf("%d\n", *p1);

//调用函数
changeValue(p1);

//再次打印a的地址
printf("%p\n",&a);
printf("%p\n",p1);

//打印出a的值
printf("%d\n", a);
printf("%d\n", *p1);
system("pause");
return 0;
}



3、让函数有多个返回值
#include <stdio.h>
#include <stdlib.h>
//定义一个函数可以计算两个整数的加减乘除运算
void test(int x, int y, int *Jia, int *Jian, int *Cheng, float *Chu)
{
//加减乘除运算实现
*Jia = x + y;
*Jian = x - y;
*Cheng = x*y;
*Chu = x/(float)y;
}
int main()
{
int jia;
int jian;
int cheng;
float chu;
//调用test函数
test(24, 7, &jia, &ji
ab44
an, &cheng, &chu);
printf("%d\n%d\n%d\n%f\n",jia,jian,cheng,chu);

system("pause");
return 0;
}




总结:
1、指针就是地址,地址就是指针/2、地址就是内存单元的编号

3、指针变量是存放地址的变量

4、指针和指针变量是两个不同的概念

5、但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样

四、二级指针

二级指针:存放一个指针变量地址的指针变量地址称为二级指针
int *p:表示以p的内容为地址的变量
int **p:表示以*p的内容为地址的变量
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 100;
//定义一级指针并且指向a
int *p = &a;
//定义一个二级指针
int **q = &p;
//定义一个三级指针
int ***r = &q;
//打印地址
printf("a的地址为:%p\n",&a);
//打印值
printf("  a的值为:%d\n",a);

//打印地址
printf("p的地址为:%p\n",&p);
//打印值
printf("  p的值为:%p\n",p);

//打印地址
printf("q的地址为:%p\n",&q);
//打印值
printf("  q的值为:%p\n",q);

//打印地址
printf("r的地址为:%p\n",&r);
//打印值
printf("  r的值为:%p\n",r);
//打印a的值
printf("%d\n",a);
printf("%d\n",*p);
printf("%d\n",**q);
printf("%d\n",***r);
system("pause");
return 0;
}




总结


二级指针可以这样理解:
1、int ***   类型的只能存放int ** 类型的变量的地址
2、如果定义了 int *p;  则取地址的&p 就是 int ** 类型的,它就是一个二级指针,因为变量p是 int * 类型的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: