指针及相关 Part1
来源:互联网 发布:php简单企业网站源码 编辑:程序博客网 时间:2024/05/21 02:35
C++中用“*”符号表示指向
例如 i_pointer是一个指针变量 而*i_pointer表示i_pointer所指向的变量。
下面两个语句作用相同:
① i=3;
② *i_pointer=3;
对指针变量必须将它定义为指针类型。
int i,j; //定义整型变量i,j
int *pointer_1, *pointer_2; //定义指针变量*pointer_1,*pointer_2
那么,怎样使一个指针变量指向另一个变量呢?只需要把被指向的变量的地址赋给指针变量即可。例如:
pointer_1=&i; //将变量i的地址存放到指针变量pointer_1中
pointer_2=&j; //将变量j的地址存放到指针变量pointer_2中
有两个与指针变量有关的运算符:
(1) &取地址运算符。
(2) *指针运算符(或称间接访问运算符)。
例如: &a为变量a的地址,*p为指针变量p所指向的存储单元。
(pointer_1 保存a的地址,pointer_2 保存b的地址)
(1) 如果已执行了“pointer_1=&a;”语句,请问&*pointer_1的含义是什么?
*pointer_1 是a,&(a)是取a 的地址,所以&*pointer_1 即变量a 的地址
(2) *&a的含义是什么?
&a 是指取a 的地址,*(&a)= *(pointer_1)意思是取指针变量pointer_1的指向对象,就是a
一共有四个概念,
指针变量, 指针变量保存的地址(指针变量指向的变量的地址),指针变量指向的变量,指针变量指向的变量所保存的值
例: 输入a和b两个整数,按先大后小的顺序输出a和b(用指针变量处理)
//code 1
int a,b;cin>>a>>b;int *pointer_1,*pointer_2;pointer_1=&a;pointer_2=&b;if (*pointer_1>*pointer_2) cout<<*pointer_1<<*pointer_2;else cout<<*pointer_2<<*pointer_1;
函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送给被调用函数的形参。
//code 2
void swap(int *p1, int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
p1,p2均为指针变量。这里并没有交换指针的朝向,而是交换了指向的两个变量本身的值
调用: swap(pointer_1,pointer_2); 传进去的实参必须是指针变量,*pointer_1 是一般变量不是指针变量
//code 3
void swap(int *p1, int *p2){
int *temp;
*temp=*p1;
*p1=*p2;
*p2=*temp;
}
会出错, 因为此时temp是指针变量但并没有让它指向谁,没有分配内存,所以不能用*temp=*p1。
// code 4
void swap(int *p1, int *p2){
int *temp;
temp=p1;
p1=p2;
p2=temp;
}
不会出错,功能是交换两个指针变量所保存的值(指向的变量的地址),不能交换两个一般变量的值。
// code 5
void swap(int x,int y)
{int temp;
temp=x;
x=y;
y=temp;
}
不用指针变量时,实参传给形参的不是地址而是确切的值例如:int a=3,b=5;swap(a,b);
只会把3和5传入函数, 和变量a,b无关, 所以a,b 的值还是3和5。这是call by value。
而code 2 则真正会改变a b 的值(假设传入了指向a和b的指针变量),称为call by reference。
数组元素的指针就是数组元素的地址。
int a[10]; //定义一个整型数组a,它有10个元素
int *p; //定义一个基类型为整型的指针变量p
p=&a[0]; //将元素a[0]的地址赋给指针变量p,使p指向a[0]
在C++中,数组名代表数组中第一个元素(即序号为0的元素)的地址。(不是第一个元素的值!)
所以p=&a[0] 与p=&a 等价
(1) p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素。
(2) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
(3) 指向数组元素的指针变量也可以带下标,如p[i]与*(p+i)等价。
[]实际上是变址运算符
对a[i]的求解过程是: 先按a+i×d计算数组元素的地址,然后找出此地址所指向的单元中的值。
#include <iostream>
using namespace std;
int main( )
{ int a[10];
int i,*p=a; //指针变量p指向数组a的首元素a[0]
for(i=0;i<10;i++)
cin>>*(p+i); //输入a[0]~a[9]共10个元素
cout<<endl;
for(p=a;p<(a+10);p++)
cout<<*p<<″ ″; //p先后指向a[0]~a[9]
cout<<endl;
return 0;
} //效率高,对地址直接操作
以下四种形况不同:
(1) p++(或p+=1)。
p=p+1. 把下一个地址付给p,p指向下一个元素
(2) *p++。
先得到p指向的变量, 然后p的值+1。如果输出得到的是前一个变量值。
注意是p的值++ 并不是(*p)的值++,因为++和*同优先级,结合方向为自右而左,所以等同于*(p++),而p++先用p再++。
(3) *++p。
先加p,然后再得到p指向的变量,如果输出得到的是后一个变量值
(4) (*p)++
表示取p指向的变量然后让变量的值+1。如果输出是+1前的变量值
实参数组名a代表一个固定的地址,或者说是指针型常量,因此要改变a的值是不可能的。 a++不被允许
0 0
- 指针及相关 Part1
- C++内存管理及指针相关
- 20.指针本质及相关符号
- 函数的相关知识及函数指针
- Exhange2010 备份及恢复 (Part1)
- Request介绍及示例 PART1
- 数组指针与指针数组 及相关的内存偏移
- 指针数组和数组指针及相关概念
- 第四章 数组和指针 (part1) 数组
- J2SE多线程 part1 多线程的相关概念
- 面试总结7--计算机网络相关问题Part1
- Green Marl 入门 Part1:语言相关
- part1
- PART1
- PART1
- 指针相关
- 指针相关
- 指针相关。。
- 3D 打印的模型 告别手动添加支撑的方式 — 使用 Meshmixer 软件
- web服务组件
- Android Studio JNI使用实例
- spring的@Transactional注解详细用法
- 近期项目的一些心得
- 指针及相关 Part1
- Java Notes: String and StringBuilder
- Scala 的 yield 例子 (for 循环和 yield 的例子)
- Python系列之五_爬虫抓图
- ContentNegotiatingViewResolver 实例
- 跨数据中心场景下,kafka集群部署模式
- HDU3790 最短路径问题
- 什么时候可以觉醒
- 如何在Controller层实现事务管理?