C/C++学习记录

本文详细介绍了指针在数组、字符串以及函数中的应用。通过指针可以便捷地访问和修改数组元素,如通过指针变量p对数组arr进行遍历。同时,指针也可作为函数参数,实现数据交换,如swap函数中的指针参数实现x和y的值互换。此外,探讨了字符指针与字符数组的相似之处,并展示了如何通过指针返回函数结果。最后,提到了指向函数的指针,强调了函数名代表其入口地址,可用于传递函数地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针与数组:(访问数组元素:通过下标/通过指针)

在数组中, 数组名即为数组首地址;结合上述指针的加减运算,对数组进行访问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类型的实体	

指向函数的指针:

函数的一个特性:类似于数组——函数名即为该函数的入口地址。

函数不能嵌套定义,不能作为参数传递;可以通过指针指向地址,然后传递指针。

定义格式:

数据类型 (*函数指针名)();

在进行函数指针的" * "操作时,可认为是执行对应的函数。

函数的指针与数组的指针不同,不能进行加减整数的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值