一、指针与指针变量
指针变量定义的一般形式为: 数据类型 *指针变量名 如 int *p;
说明: *表示其后的名字是一个指针变量,它只是一个标识,不是变量名本身的一部分
“指针变量名”需要符合C++中标识符的命没规则
“数据类型”是指该指针变量 所指向的储存单元中数据的数据类型。
是要在一个变量前加上区地址运算符“&”,即可获取该变量的地址值。
特点:单向值传递
二、指针运算
2.1 赋值运算
指针变量在使用前必须有确定的指向
*pa=&b //非法,左值与右值的类型不同
Pb=0x3000; //非法 ,不能用常数给指针变量赋值
NULL 是一个指针常量,其值为0, 它用作指针是表示空地址。
2.2 关系运算
两个指针变量进行关系运算时,它们应该是指向同一数据类型的数据。
如果两个相同数据类型的指针变量相等,就表示两个指针变量是指向同一的变量。
在指向不同数据类型的指针变量之间进行关系运算是没有意义的。
2.3算术运算
指针可以进行加减、自增自减等算术运算,指针可以直接加减一个整数,但有特殊的运算规则。
当指针P指向内存中某一数据时,p+n表示p当前所指数据位置后方第n个数据的地址,而p-n表示指针p当前所指数据位置前方第n个数据的地址
1(p) | 2 | 3(p+2) | 4 | 5 |
p±n表示实际位置的地址是:(p)±n×数据长度(字节数) (p)表示指针p中的地址值
三、指针与数组
C++语言中规定:数组名代表数组存储的首地址,也就是数组中的第一个数组元素的地址
如: p=&a[0]
p=a (两个等价)
(1)p+i或a+i就是数组元素a[i]的地址即它们都指向数组元素a[I]。*(p+i)或*(a+i)与a[i]等价
(2)指向数组的指针变量也可以带下标, 如p[i]与*(p+i)等价。
#include<iostream>
using namespace std;
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//cout << "第一个元素" << arr[0] << endl;
int* p = arr;
cout << "利用指针访问第一个元素" << *p << endl;
p++;
cout << "利用指针访问第二个元素" << *p << endl;
cout << "利用指针遍历数组 " << endl;
int* p2 = arr;
for (int i = 0; i < 10; i++)
{
cout << *p2 << endl;
p2++;
}
return 0;
}
四、指针与函数
当说明一个函数的返回值为指针类型是,函数用return 语句返回一个地址值给调用函数。
函数原型的说明格式为: <数据类型> *<函数名>(<形参表>)
#include<iostream>
using namespace std;
void bubbleSort(int* arr, int len)
{
for (int i = 0;i< len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void printArray(int* arr, int len);
int main()
{
int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
int len = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, len);
void printfArray(int* arr, int len);
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << endl;
}
}
return 0;
}
4.1 指向函数的指针
语法格式为:<类型> (*<变量名>)(<形参表>)
int (*fp1)(int ,int)
只能将与指向函数的指针变量具有相同的函数参数表的相同类型返回值的函数名赋给函数指针变量。
4.2 函数调用的参数传递方法
4.2.1 值传递
特点:单向传递
使用变量的值传递方式时,主调函数的实参用常量、变量或表达式;被调函数的形参用变量。
#include<iostream.h>
void swap(int x,int y)
{
int t=x;
x=y;
y=t;
cout<"x="<<x<<"y="<<y<<endl;
}
void main()
{
int a=3;
int b=4;
cout<"a="<a<<"b="<<b<<endl;
cout<<"******swap******<<endl;
swap(a,b);
swap<"a="<<a<<"b="<<b<<endl;
}
结果为 a=3 b=4
******swap******
x=4 y=3
a=3 b=4
4.2.2 地址传递
在被调函数的函数体中根据实参传过来的地址来交换相应的实参数据
#include<iostream.h>
viod swap(int *x, int *y)
{
int t=*x;
*x=*y;
*y=t;
}
void main()
{
int *p1,*p2,a,b;
cin>>a>>b;
cout<<"a="<<a<<"b="<b<<endl;
p1=&a;
p2=&b;
if(a<b)
{
cout<<"******swap*******<<endl;
swap(p1,p2);
}
cout<<"a="<<a<<"b="<b<<endl;
}
结果为
a=3 b=4
******swap******
a=4 b=3
4.2.3引用传递
语法格式: <数据类型> &<引用变量名>=<变量名>
#include<iostream.h>
void swap(int &x,int &y)
{
int t=x;
x=y;
y=t;
}
void main()
{
int a=3;
int b=4;
cout<<"a="<<a<<"b="<b<<endl;
if(a<b)
{
cout<<"******swap******"<<endl;
swap(a,b);
}
cout<<"a="<<a<<"b="<b<<endl;
}
结果为:
a=3 b=4
******swp******
a=4 b=3