指针及数组
一.指针
我们所申请的变量或数组都分配在内存中,它们在内存中存放的地址值可以被存在另个变量中,即一个变量指向它们在内存中的地址,这个指向内存变量地址的变量即为指针。如变量为 aa的在内存中的地址为0x6859ef.而0x6859ef又存放在bb的变量中,通过访问bb就可以找到aa,这个变量bb就是指向aa的指针。
变量在内存中是根据数据类型的大小分配的,以字节为单位。
1.在C++中指针的声明形式为:
type* variable=NULL;
type *varialble=NULL;
type表示类型,*号可以靠近type写也可以靠近varialble写,根据各人喜好。 NULL表示此指针中的数据无效,不指向任何数据.NULL等同于0.此时指针为悬浮指针,即指针不指向任何数据。
2. 给指针变量赋值:
第一种是直接给指针变量赋值NULL或0. 如: int* pvalue=0(NULL);
第二种是直接是把变量的地址给指针。取变量地址是在变量前加上&符号即可。
如:int newValue=25;
int pvalue=&newValue;
3. char类型指针
在指针类型中,char类型是一种特殊的类型,char类型指针具有非常有意思的属性,即可以用字符串字面值初始化。
如 char* pvalue="my test it .";
这条语句用引号之间的字符串创建某个以\0终止的字符串字面值,并将此字面值的地址存储在指针pvalue中,此字面值的地址将是第一个字符的地址:
此时你如果想得到这个字符串的值,可以用cout<<pvalue<<endl;即可。
在char类型中,指针pvalue的值是整个字符串并不是像其它类型显示为一整型的数据。这就是char类型的特殊之处。
对指针解引用,即在指针前加上*即可,即得到指针所指向地址中的内容。 由于pvalue指向字符串的首地址,因为*pvalue显示的为m,下个指针指向的内容是y,
即pvalue向下移并解引用.即*(pvalue+1).读取后面的值可以此类推。
4. 三种指针类型
(1) 指向常量对象的指针
(2) 指向某个对象的常量指针
(3) 指向常量对象的常量指针
顾名思义:
第一种,我们不能改变指针指向的对象内容,但指针可以指向其它对象
const char* pstring="some value";
第二种, 我们不能去修改指针中存储的地址,但可以修改指针指向的对象。
char* const pstring="some value";
在最后一种情况中,指针和被指向的对象都被定义为常量,因此都不能修改。
const char* const pstring="some value";
以上不限于char类型。
二、数组
在内存中连续开辟空间并存放相同类型的数据的形式就是数组。
数组与普通变量的不同之处在于用数组名就可以连续操作多种数据,而普通变量只是一次只能操作一个数据。
1.数组的形式
type var[dim];
如: int arr[5]; 表明arr为含有5个元素的整形数组。如果没有初始化数组就一定要指定维数5,因为编译器要为变量分配5元素的空间。
type var[dim]={xx,xx,...};
如: char arr[3]={'a','b','c'};或 char arr[]={'a','b'}; 如果指定的维数多于大括号中的维数,则多出的部分根据元素类型为默认值。
如果没有写明维数,则根据大括号中元素数为维数。如果给定的维数小于大括号元素的数,则编译器会报错。
2.数组的维数
数组分为一维数组和多维数组
打个比方:一果园中,只有一行苹果树,每棵树都给了标记。我们可以写个一维数组,如 int AppleTree[10]; 即这行树有10棵,下标从0到9.
一果园中,共有5行苹果树,每行有10棵,我们可以写成二二维数组,如 int AppleTree[5][10]; 这样共有5*10棵树。每行又为一维数组。
即ApplieTree[0][2]表示第一行的第三棵树。
一果园中,共有8块地皮,每块地皮上共有5行苹果树,每行有10棵,则数组为 int AppleTree[8][5][10],即三维数组,AppleTree[2][3][8]表示
第三块地中第四行的第9棵树。
因此C++中的数组声明形式为:
type Array[dim0][dim1][..][dimn];
三、指针和数组
在大多数情况下,数组名即为指针,它指向数组中的第一个元素。如下所示:
#include <iostream>
using namespace std;
void main()
{
int arr[3]={15,20,25};
int *pdata=NULL;
pdata=arr;
cout<<*pdata<<endl;
cout<<*(pdata+1)<<endl;
pdata=&arr[2];
cout<<*pdata<<endl;
}
显示的结果为:
如果把数组名赋给一指针,则此指针是对整个数组的引用。如果要读取某元素的值,则用“&数组名[索引]”即可。
数组根据其类型不同,所占用内存的大小也不一样,如果为double类型的数组,它的每个元素占用8个字节,则调用指向它的指针移到下一元素的地址时指针所包含的地址也增加8个字节。而用short类型时,两个位置间的为2个字节。
如下图,以十进制显示地址:
#include <iostream>
using namespace std;
void main()
{
double arr[3]={15,20,25};
double *pfirst=&arr[1];
double *pnext=&arr[2];
cout<<dec<<pnext<<endl;
cout<<dec<<pfirst<<endl;
}
结果为:
相差8个字节.