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 ; }