指针与数组:(访问数组元素:通过下标/通过指针)
在数组中, 数组名即为数组首地址;结合上述指针的加减运算,对数组进行访问0
指向数组的指针:
首先声明一个数组和一个指针变量
int arr[10];
int *p;
显然数组arr[]分配了10个连续的int型内存空间,数组的首地址(p)即为数组名(arr),同时也是数组第一个元素的地址(arr[0]);通过如下方法让指针变量p指向数组arr:
//数组名为数组首地址
p = arr;
//或
//数组第一个元素的地址为数组首地址
p = &arr[0];
用指针操作数组:
1.*p = 1
赋值操作:p指向数组的第一个元素;(取出P的值并赋为1),即arr[0] = 1.
2.p±1
指针加减整数,内存单元的移动;*(p+1) = 2,即arr[1] = 2.
3.类推知 p+i 指向 arr[i]
4.进行p±的操作需考虑数组边界
用指针访问数组的元素:
#include<iostream>
#include <string>
using namespace std;
int main() {
int arr[5] = { 1,2,3,4,5 };
int* p;
p = arr;
//或p = &arr[0];
int i;
//输出第一个元素arr[0] = 1
cout << "arr[0] = " << *p <<"\n";
cout << "\n";
//for循环输出所有元素
for (i = 0; i < 5; i++) {
cout << "arr[" << i << "] = " << *(p+i) << "\n";
}
}
输出结果:
※ 数组名不等价于指针变量;指针变量可以加减和&,对于数组名是非法的;编译时,数组名是一个常量.
字符指针与字符数组:
字符数组方式:
#include<iostream>
#include <string>
using namespace std;
int main() {
char word[] = "point";
cout << "by total: " << word << "\n" << endl;
cout << "by letter\n" << endl;
int i;
for(i=0;i<sizeof(word);i++)
cout << word[i] << endl;
}
输出结果:
字符指针方式:
操作方式类似;指针看做字符数组的数组名.
#include<iostream>
#include <string>
using namespace std;
int main() {
const char* bird = "parrot";
cout << bird;
}
输出结果:
指针与函数:
指针作为函数的参数
#include<iostream>
#include <string>
using namespace std;
void swap(int *px,int *py);
int main() {
//int* px, * py;
//※指针与参数的关联!
int x, y;
int* px;
int* py;
px = &x;
py = &y;
cout << "please enter two numbers\n";
//错误记录:
//cin >> *px;
//cin >> *py;
cin >> x;
cin >> y;
cout << "before: " << " *px = " << *px << " *py = " << *py <<"\n";
swap(*px, *py);
cout << "after: " << " *px = " << *px << " *py = " << *py << "\n";
}
void swap(int* px, int* py) {
int temp;
temp = *px;
*px = *py;
*py = temp;
}
输出:
#include<iostream>
#include <string>
using namespace std;
void swap(int x,int y);
int main() {
int x, y;
cout << "please enter two numbers\n";
cin >> x;
cin >> y;
cout << "before: " << " x = " << x << " y = " << y <<"\n";
swap(x, y);
cout << "after: " << " x = " << x << " y = " << y << "\n";
}
void swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}
输出:
当传入的参数为指针(*px、*py)时,调用swap方法后x、y的值发生交换。如果直接传入x、y,name交换只在swap中有效,main中不发生交换。
指针作为函数的返回值:
声明方式如下:
//数据类型 *函数名(参数列表){
// 函数体
// }
int s;
int *sum(int x,int y){
s = x + y;
return &x;
}
测试:
#include<iostream>
#include <string>
using namespace std;
//声明sum函数
int* sum(int x, int y);
int main() {
int* s = sum(1, 2);
cout << "sum = " << *s;
}
int* sum(int x, int y) {
int s = x + y;
return &s;
}
//易错:
//int s = sum(1, 2);
//error:int*类型的值不能用于初始化int类型的实体
指向函数的指针:
函数的一个特性:类似于数组——函数名即为该函数的入口地址。
函数不能嵌套定义,不能作为参数传递;可以通过指针指向地址,然后传递指针。
定义格式:
数据类型 (*函数指针名)();
在进行函数指针的" * "操作时,可认为是执行对应的函数。
函数的指针与数组的指针不同,不能进行加减整数的操作。