算法竞赛入门经典_两个数交换/计算数组和_指针的简单应用

问题:
C++实现:

C语言用调用栈(Call Stack)来描述函数之间的调用关系。调用栈由栈帧 (Stack Frame)组成,每个栈帧对应着一个未运行完的函数。

#include<stdio.h>
#include<iostream>

using namespace std;

void swap(int* a, int* b)
{
	int t;
	t = *a;
	*a = *b;
	*b = t;
}

int main()
{
	int a,b;
	cin >> a >> b;
	swap(&a, &b);
	cout << a <<" "<< b << endl;
	return 0;
}

计算数组和的函数:
直接把参数a写成了int* a,暗示a实际上是一个地址。在函数调用时a 不一定非要传递一个数组
以数组为参数调用函数时,实际上只有数组首地址传递给了函数,需要另加一个参数表示元素个数。除了把数组首地址本身作为实参外,还可以利用指针加减法把其 他元素的首地址传递给函数。

 
 
int sum(int* a, int n)
{
    int ans = 0;
    for(int i = 0; i < n; i++)
        ans += a[i];
        return ans;
}
int main()
    int a[] = {1, 2, 3, 4}; 
     cout<<sum(a+1, 3)<<endl;
     return 0;
}

计算左闭右开区间内的元素和(两种写法):
指针a+1指向a[1],即2这个元素(数组元素从0开始编号)。因此函数sum“看到”{2, 3, 4} 这个数组,因此返回9。一般地,若p是指针,k是正整数,则p+k就是指针p后面第k个元 素,p-k是p前面的第k个元素,而如果p1和p2是类型相同的指针,则p2-p1是从p1到p2的元素个数(不含p2)。下面是sum函数的另外两种写法。
//写法一:
int sum(int* begin, int* end) 
{ 
	int n = end - begin;  
	int ans = 0;  
	for (int i = 0; i < n; i++)    
		ans += begin[i];  
	return ans; 
}
//写法二:
int sum(int* begin, int* end) 
{ 
	int *p = begin;  
	int ans = 0;  
	for (int *p = begin; p != end; p++)    
		ans += *p;  
	return ans; 
}





猜你喜欢

转载自blog.csdn.net/qq_38734403/article/details/80463634