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

 

原文链接: https://www.cnblogs.com/jackyweb/archive/2012/02/01/2334080.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++的知识

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/40756

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午5:35
下一篇 2023年2月8日 下午5:36

相关推荐