C++数组与指针

来源:互联网 发布:2017淘宝宝贝排名规则 编辑:程序博客网 时间:2024/05/16 02:09

数组:

数组的位数必须用值大于等于1的常量表达式定义。此常量表达式只能包含整型字面值常量。枚举常量或者常量表达式初始化的整型const对象。非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。

显式初始化数组:

int ia[3]={0,1,2}

如果没有显式提供元素初始值,则数组元素会像普通变量一样初始化:

在函数体外定义的内置数组,其元素均初始化为0;

在函数体内定义的内置数组,其元素无初始化;

不管数组在哪里定义,如果其元素类型为类类型,则自动调用该类的默认构造函数进行初始化,如果该类没有默认构造函数,则必须为该数组的元素提供显示初始化。

显示初始化不需要制定数组的维数:int is[]={1,2,3}

不允许数组直接赋值。

指针:

简单来说,指针就是指向对象,在C语言来定义,指针则是指向一个变量的地址。我觉得这个C语言的定义更来的通俗易懂些。所以定义一个指针,赋值时,应该使用取引用操作符.数组名是数组的首地址,将指针进行加值或减值运算,其实就是移地址的操作。

int * p=0可以,但是不能int *p=1;因为前者表示不指向任何对象,等效于初始化为NULL。

void* 指针,可以保存任何类型对象的指针,但是他只支持几种有限的操作:与另一个指针进行比较,向函数传递void*指针,或从函数返回void*指针,他并不支持使用void*/指针操作它所指向的对象。

动态数组就是使用指针进行分配内存空间,而这个分配内存空间的大小可以是变量。int *p=new int[size];delete[]p;记得销毁空间。

我们知道*就是解引用,他的优先级高于+ - 符号。所以*p+1,得到的是指向对象的值+1;那么* p++ 则有所不同,他输出的是*p,但输出完p后就会是p指向的地址向前移一位,同理,* ++p;输出的则是p指向的地址向前移一位后的值。

指针变量作为函数的参数:

用指针做参数,实际参数与形式参数仍然是值传递,即在调用时,将实际参数的值赋予形式参数,在调用时,不能改变实际参数指针变量的值,但能改变指针变量所指变量的值。

函数指针:

指向函数的指针变量  一般形式为

数据类型(* 指针变量名)()

int (*p)()第一个括号表示这是一个指向int类型的指针,第二个括号表示*p是函数。定义函数指针的目的之一是将函数作为另一个函数的参数。

测试代码如下:

#include<iostream>
#include"test.h"
using namespace std;
void wap(int *p,int *p2){
int temp;temp=*p;*p=*p2;*p2=temp;
}
void wap2(int *p,int *p2){
int *temp;temp=p;p=p2;p2=temp;
}
void main(){

int i=10;
int *p=&i;
cout<<p+4<<endl;
cout<<*p+4<<endl;
cout<<* ++p<<endl;
int x;
cin>>x;
x++;
int * pp=new int[x];
delete []pp;
A a;
A * aa;
aa=&a;
aa->setA(1);
cout<<(*aa).getA()<<endl;
A *b=new A();
b=&a;
cout<<b->getA()<<endl;
int ia[3]={1,2,3};
int * tp;
tp=ia;
cout<<tp<<endl;
cout<<*tp<<endl;
cout<<*(tp++)<<endl;
cout<<*(++tp)<<endl;
int *ty=0;
void *pv=&a;
cout<<(pv==b)<<endl;
int r=3;
int e=4;
wap(&r,&e);
cout<<"r"<<r<<endl;
cout<<"e"<<e<<endl;
 r=3;
 e=4;
wap2(&r,&e);
cout<<"r"<<r<<endl;
cout<<"e"<<e<<endl;
int * y1;
y1=&r;
int *y2;
y2=&e;
wap(y1,y2);
cout<<"r"<<*y1<<endl;
cout<<"e"<<*y2<<endl;
void (*hh)(int *p1,int *p2);
hh=wap;
hh(&r,&e);
cout<<"r"<<r<<endl;
cout<<"e"<<e<<endl;
}