C++的知识
1. 指针
地址运算符 &
int y=5;
int *yPtr;
//赋值
yPtr=&y;
间接引用运算符或复引用运算符 *
& 和 *是逆运算 *&yPtr 、&*yPtr 、yPtr 都是等价的。
指针与数组
可以将数组赋值给指针,是的指针指向数组的第一个元素。当然,这有一个前提,即数组元素的类型和指针指向的类型是相同的。可见,在C++中,数组和指针有着密切的关系,二者甚至可以互换使用:数组名可以视为一个指针,只是这个指针的值在数组声明后就不能变化,这种指针称为常量指针,通过指针也可以访问数组的每个元素。此外,数组元素也可以是指针。
函数指针
虽然函数不是变量,但其代码仍占有存储空间,该存储空间的首地址可以赋给某一指针,这个指针叫函数指针。
int (*fp) (char) --- fp是一个函数指针,它指向的函数返回值为 int 类型, 带一个char类型的参数。由于函数调用符()优先级比指针运算符*高,因此 *fp要用括号
要将函数指针指向某一函数,可以通过赋值语句来实现,假如已定义了函数 int f(char); 那么语句 fp=f ; 使得fp指向f,也即fp中保存了函数f的入口地址。
int i=(*fp)('J') // 与语句 i=f('J'); 等价
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
using namespace std;
bool ascending(int , int);
bool descending(int, int);
void sortArray(int[], int, bool(*)(int, int));
void displayArray(int[],int);
int main()
{
int *a;
int i, num;
//输入要排序的整数的数目
cout<<"Please enter the number of integers:";
cin>>num;
//动态分配数组,以保存输入的整数
a= new int[num];
if (a==NULL)
{
cout<<"maloc error ! exit."<<endl;
return 0;
}
//输入排序的整数
for(i=0;i<num;i++)
cin>>a[i];
//使用ascending调用函数sortArray对a进行配需
sortArray(a, num, ascending);
//输出a排序后的结果
cout<<"After ascending sorting:"<<endl;
for(i=0;i<num;i++)
cout<<a[i]<<" ";
cout<<endl;
//释放动态分配的空间
delete []a;
return 0;
}
bool ascending(int a, int b)
{
return (a<b);
}
bool descending(int a,int b)
{
return (a>b);
}
void sortArray(int b[], int len, bool(*compare)(int, int))
{
for (int pass=0; pass<len-1;pass++)
for (int i=pass+1; i<=len-1; i++)
if ((*compare)(b[pass],b[i]))
{
int hold;
hold=b[pass];
b[pass]=b[i];
b[i]=hold;
}
}
指针作为函数参数传递
值传递和引用传递
void Exchg1(int x, int y) //定义中的x,y变量被称为Exchg1函数的形式参数
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf(“x=%d,y=%d\n”,x,y)
}
void main()
{
int a=4,b=6;
Exchg1 (a,b) //a,b变量为Exchg1函数的实际参数。
printf(“a=%d,b=%d\n”,a,b)
}
值传递
main()
{
int a=4,b=6;
Exchg1(a,b) //这里调用了Exchg1函数
printf(“a=%d,b=%d”,a,b)
}
Exchg1(a,b)时所完成的操作代码如下所示。
int x=a;//←
int y=b;//←注意这里,头两行是调用函数时的隐含操作
int tmp;
tmp=x;
x=y;
y=tmp;
引用传递:
void find1(char [] array, char search, char * pa)
{
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
pa=array+i
break;
}
else if (*(array+i)==0)
{
pa=0;
break;
}
}
}
void main()
{
char str[]={“afsdfsdfdf\0”}; //待查找的字符串
char a=’d’; //设置要查找的字符
char * p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。
find1(str,a,p); //调用函数以实现所要操作。
if (0==p )
{
printf (“没找到!\n”);//1.如果没找到则输出此句
}
else
{
printf(“找到了,p=%d”,p); //如果找到则输出此句
}
}
函数调用时会对每一个参数进行一个隐含的赋值操作。
整个调用如下:
array=str;
search=a;
pa=p; //请注意:以上三句是调用时隐含的动作。
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
pa=array+i
break;
}
else if (*(array+i)==0)
{
pa=0;
break;
}
}
引用: http://c.chinaitlab.com/c/basic/200906/788050.html