黑马程序员技术交流社区
标题: 指针 [打印本页]
作者: hugin 时间: 2016-9-23 08:55
标题: 指针
//------------------------------指针变量
1、指针变量 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。
因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
注意: 严格意义上说,指针是一个地址,是一个常量指针 变量是存放一个地址 是一个变量。
定义一个指针变量
指针变量 ----> 变量 ----> 存放地址的变量
int a = 10; //定义一个整型变量 变量名为 a a的值为10
int *p = &a; // 定义了一个指针变量,里面存放的是a的地址
/*
当在定义的时候 int *p = &a; * 类型说明符 说明我定义的这个变量是一个指针变量
在使用的时候 *p = 10; * 它是一个操作符 获取指针变量p指向的地址所对应的内容
*/
int a = 998;
int *p = &a;
# 指针变量
&p : p 变量名 &p 指针变量的地址
p : p指针变量 里面存放的就是地址 a的地址
*p : p这个指针变量指向地址(a的地址)所对应的内容 998
a : 整型变量
//-----------------------------初始化与引用
//定义的同时进行初始化
int a = 10; //定义了一个int类型的变量
int *p = &a; //定义了一个int *类型的指针变量 指向的就是a的地址
*p ---> 指向的地址所对应的内容
// 先定义后初始化
int b = 5;
int *p1; // 仅仅只是定义
p1 = &b; // 对指针变量进行初始化
//定义了一个指针变量
int *p = &a;
int *p1 = p;
*p = 10;
printf("%d",*p); p指向的地址所对应的内容
注意点
1、多个指针变量可以指向同一个地址 int a = 5;
2、指针的指向是可以改变的
3、指针没有初始化里面是一个垃圾值(0x0),这时候我们这是一个野指针, 如果操作一个野指针
1)可能会导致程序崩溃
2)访问你不该访问数据 "所以指针必须初始化才可以访问其所指向存储区域"
//--------两个有关的运算符:
& :取地址运算符;
* :指针运算符(或称"间接访问" 运算符)。
int *p = &a;
*&a ----> a
&变量名;
*指针变量名
关于*的使用注意:
1)在定义变量的时候 * 是一个类型说明符,说明定义的这个变量是一个指针变量
int a = 5;
int *p = &a;
int *p1 = p;
2)在不是定义变量的时候 *是一个操作符,访问指针所指向存储空间的内容
int x = *p;
//----------------野指针
//只是定义了一个指针变量,没有初始化
NULL // 关键字 空地址 0x0
int *p; //
*p = 10;
//-------------------------指针为什么要区分类型
一个指针变量所占用的内存空间是固定的。
虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。
结论:"定义什么类型的指针就应该指向什么类型的变量。"
int * ---> 指向int类型变量的指针
char *
double *
//----------------------指针常见的应用场景
1)在被调函数中可以修改主调函数中变量的值
编写一个函数,在这个函数修改主函数中一个变量的值
2)函数返回多个值(看起来)
结合指针 用 一个函数实现 加减乘除
num1 ,num2
一个函数 ----> 主函数中 输出 +-*/ 的结果
//--------------------函数实现两变量交换
int num1 = 10,num2 = 20;
函数中
主函数中打印 num1 : 20, num2 : 10
作者: hugin 时间: 2016-9-23 08:56
//------------------------二级指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针(地址)的指针变量。也称为“二级指针”
int a = 10;
int *p = &a;
&p ----> 指针变量的地址 地址 * &p ----> p 地址 (&a) * p ---> a
int a = 5;
int *p = &a;
int ** p1 = &p;
p---指向a的地址
*p---a的地址对应的值----也就是5
p1--指针变量p的地址 &p
*p1 ---> p p的地址所对应的内容 --- a的地址
* *p1 ----> * a的地址 --> *p --> 5
作者: hugin 时间: 2016-9-23 08:57
//-----------------------指针数组 : 存储指针的数组
什么是指针数组?
是一个数组! 里面的数组元素都是地址
int a = 10,b = 15,c = 20;
int *pa[3] = {&a,&b,&c}; //指针数组
pa[0] ----> &a
pa[1] ----> &b
pa[2] ----> &c
类型说明符 *数组名[数组长度]
作者: hugin 时间: 2016-9-23 08:59
//定义了一个指针数组 跟二维数组结合 类型说明符 *数组名[二维数组第一维长度]
int arr[2][3] = {
1,2,3,
4,5,6
};
int *pa[2] = {arr[0],arr[1]};
for(int i = 0;i < 2;i++){
for(int j = 0;j<3;j++){
*(pa[i]+j)
// pa[i][j];
}
}
作者: hugin 时间: 2016-9-23 09:00
//-----------------------数组名遍历数组元素
&arr == arr == &arr[0] == arr[0] == &arr[0][0] ---> 数组的首地址 / 意义不同
&arr --> 整个数组的地址 +1(越界)
arr --> 指向数组第1行的地址 &arr[0]
&arr[0] --> 指向数组第1行的地址
arr[0] --> 第1行的内容/二维数组的第一个一维数组 指向这个一维数组第一个元素的地址 == &arr[0][0]
&arr[0][0] 整个二维数组第1个一维数组里面第一个元素的地址
作者: Doublek 时间: 2016-9-23 13:19
受益良多
作者: Mr.Canon 时间: 2016-9-23 18:39
还行~理解的蛮透彻的~!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |