C++学习note7(指针)

一,指针的定义

指针用于记录变量的地址。

代码示例:

#include<iostream>
using namespace std;

int main(){
	
	int a=0;
	int * p;                  (int * 为一体)
	p=&a;                     p为a的地址

	cout<<"a的地址为:"<<&a<<endl;
	cout<<"指针p为:"<<p<<endl;
 
	*p=1000;                   *p代表取p地址对应变量a
	cout<<"a="<<a<<endl;
	cout<<"*p="<<*p<<endl;

	system("pause");
	return 0;
}
a的地址为:0135FD1C
指针p为:0135FD1C
a=1000
*p=1000

注:指针在32位系统下占用4个字节(一个16进制数)(默认情况),在64位操作系统下占用8个字节  

二, 空指针和野指针

1.空指针:int * p=NULL  用于初始化指针变量,空指针指向内存不可访问。

2.野指针:指针变量指向非法内存

错误代码示例1:

include<iostream>
using namespace std;

int main(){

	int * p=NULL;
	*p=100;              定义空指针后不可对其进行访问,故程序出错
	cout<<*p<<endl;

	system("pause");
	return 0;
}

错误代码示例2:

#include<iostream>
using namespace std;

int main(){

	int * p=(int *)0x1100;    自行定义的地址未经申请故不可访问程序出错
	cout<<*p<<endl;

	system("pause");
	return 0;
}

 三,const修饰指针

1.常量指针:指针的指向的方向可以修改,但值不能改。

int a=10;
int b=20;
const int * p=&a;

p=&b;   常量指针可以改地址
 

2.指针常量:指针方向不可该,值可改。

int a=10;
int b=20;
int * const p=&a;

*p=20;    指针常量可改值

3.指针和常量都被修饰时:

const int * const p=&a;

  此时指针方向和值都不能修改

 四,指针与数组

可以用指针来遍历数组中的每一个元素。

代码示例i:

#include<iostream>
using namespace std;

int main(){

	int a[10]={1,2,3,4,5,6,7,8,9,10};
	int * p=a;     取首地址 

    for(int i=0;i<10;i++){

	cout<<* p<<" ";
	p++;              向后移四个字节,即跳到下一个元素
          
	}

	system("pause");
	return 0;
}

五,指针与函数 

1.值传递:形参变,实参不变

2.地址传递:可通过地址改变实参

代码示例:地址传递

#include<iostream>
using namespace std;

void swap1(int * p1,int * p2){
	int temp=*p1;
	*p1=*p2;
	*p2=temp;
}
int main(){

	int a=10;
	int b=20;
	swap1(&a,&b);            交换地址
	cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;

	system("pause");
	return 0;
}
a=20
b=10

 实际应用:

问题:封装一个函数,利用冒泡排序实现对数组的升序排列

#include<iostream>
using namespace std;

void increase(int *a,int length){    参数:首地址,长度
	for(int i=0;i<length-1;i++){
		for(int j=0;j<length-1-i;j++){
			if(a[j]>a[j+1]){
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
}
int main(){

	int a[10]={4,3,6,9,1,2,10,8,7,5};
	increase(a,10);

	for(int i=0;i<10;i++){
		cout<<a[i]<<" ";
	}
	system("pause");
	return 0;
}
1 2 3 4 5 6 7 8 9 10 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值