C++ 指针复习

 

最近开始准备实习的笔试,复习了一下C++ 指针的内容

在计算机的每一个字节都有一个对应的地址:

很多书上用街道上的门牌比喻:地址使用数字来表示的,就和街道上的门牌号一样。但这样是不甚贴切的,因为存在着二级指针和一个数据存在多个地址等情况。

所以我觉得用字典前面的目录来比喻比较贴切。

在我们的程序中:

先举一个简单的例子,int *p ; 这里表明我们定义了一个指针,也就是说我们在字典的目录里定义了一条目录,但是它指向的内容(值),指向多少页(存放的地址)都是不确定的。

int *pc ;//定义了一个指针
int   ac;
pc = &c ;//这个时候,指针就指向了a
c= 5;//p指向的a 就存了值 5;

cout << pc <<endl;//0034FE88
cout << &c <<endl;//0034FE88
cout << c <<endl;  //5
cout << *pc <<endl;//5
cout << pc + 1 <<endl;//0034FE8C
*pc = 3;
cout << c <<endl;//3
int *pd;
*pd = 4;//error

可以看到,这时,pc存放着数据c的地址,而*pc代表着c中存放的值,改变了*pc也就意味着改变了变量c的值,值得注意的是,pc+1的值并不是代表着pc地址值+1,而是pc地址值+1*int数据所占字节的值。

但是如果一个指针,不进行初始化的话,是不能够进行赋值的,Run-Time Check Failure #3 - The variable 'pd' is being used without being initialized.

 

#include <iostream>
using namespace std;

int main()
{
int a[]={30,21,12,43,34,75};
char b;
int *p = a;
for(int i = 0 ; i<5 ; i++)
cout << *(p++) <<endl;//3,30,21,12,43
int *q = a;    
cout << q <<endl;//0030F978
cout << q+1 <<endl;//0030F97C
cout << *q <<endl;//30
cout << *q+1 <<endl;//31
cout << *(q+1) <<endl;//21
cout << &a[1] <<endl;//0030F97C
cout << &q <<endl;//0030F930
cin>>b;
return 0 ;
}

可以看出,实际上q就存放着数组a的首地址,而q+1就是a[1]元素的地址,*(q+1)就是a[1].

传递指针的方式和传递引用参数极为相似:

传递引用:

void centimize (double &)
void main{
double var =10.0;
centimize (var);}
void centimize (double &a){
a = a*2.54}
传递指针:

void centimize (double*)
void main{
double var =10.0;
centimize (&var);}
void centimize (double *a){
*a = *a*2.54}

值得注意的是,字符串常量指针的输出cout 并不是输出字符串数组的首地址,而是整个字符串,这与Cout 的重载有关?(存疑)

int main()
{
    char str1[] = "cegf";
    char *str2;
    str2 = "abcd";
    int  a[] = {1,2,3,4};
    cout << str1 <<endl;//cegf
    cout << str2 <<endl;//abcd
    cout << a <<endl;//0034F87C
    int b;
    cin>>b;
    return 0 ;
}

 

posted @ 2016-03-29 18:10  Crazod  阅读(235)  评论(0编辑  收藏  举报