博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针和引用(4)指向指针的指针
阅读量:6238 次
发布时间:2019-06-22

本文共 1896 字,大约阅读时间需要 6 分钟。

1.知识点

(1)在程序中可以声明指向任何数据类型的指针,指针也可以指向指针类型,成为指向指针的指针。下面是一个使用例子

1 int a=10,b=20;2 int *q=&a;3 int **p=&q;4 **p=30;

(2)如果想通过指针在被调函数中修改主调函数的变量,必须将主调函变量(务必确定该变量的类型,有时候可能变量本身就是指针,这时候形参就需要是指针的指针了)的地址作为参数,在被调函数中修改主调函数指向的内容。

2.面试题

2.1指针作为参数的常见错误

1 int find(char *s, char ch, char *sub) { 2     for (int i = 0; *(s + i) != '\n'; i++) { 3         if (*(s + i) == ch) { 4             sub = s + i + 1; 5             return i; 6         } 7     } 8     return 0; 9 }10 11 int main(int argc, char *argv[]) {12     char fullName[] = {
"Jordan#Michale"};13 char *givenName=fullName;14 15 int cnt = find(fullName, '#', givenName);16 cout << givenName << "has a" << cnt << "characters 'family name" << endl;17 18 getchar();19 return 0;20 }

重点知识点:(1)如果想通过指针在被调函数中修改主调函数的变量,必须将主调函变量的地址作为参数,在被调函数中修改主调函数指向的内容。

(2)通过指针传递参数时,最大的忌讳就是以为只要参数是指针就万事大吉了。实际上,应该首先确定要修改的变量的类型,然后再将其地址作为参数。如果要修改的变量本身就是指针,就应该将该指针的地址作为参数,此时的形参类型是指向指针的指针。

以上第三个参数的指向的改变并不能带来实参的改变,正确答案如下:

1 int find(char *s, char ch, char **sub) { 2     for (int i = 0; *(s + i) != '\n'; i++) { 3         if (*(s + i) == ch) { 4             *sub = s + i + 1; 5             return i; 6         } 7     } 8     return 0; 9 }10 11 int main(int argc, char *argv[]) {12 13     char fullName[] = {
"Jordan#Michale"};14 char *givenName=NULL;15 16 int cnt = find(fullName, '#', &givenName);17 cout << givenName << " has a " << cnt << " characters 'family name" << endl;18 19 getchar();20 return 0;21 }

 2.2指向指针的指针和二维数组的区别

1 int main(){2   int a[2][3]={
{
1,2,3},{
4,5,6}};3 int **p=a;4 cout<<**p<

解析:p是指向指针的指针(类型是int **),a<=>&a[0],a[0]是一个一维数组(相当于对一维数组名a[0]取地址,它应该赋值给int *[3])。所以左边是一个指向指针的指针,右边是一个指向数组的指针,两边类型不同。如果想编译通过,应该定义一个指向数组的指针,修改如下:

1 int (*p)[3]=a;

小技巧:判断变量的类型:

变量的类型在声明之初就已经确定了,在程序中只要将声明语句中变量名去掉,剩下的部分就是变量的类型。如下:

1 int **p的类型是:int**2 int a[2][3]的类型是:int[2][3]3 const int(const *p)[3]的类型是:const int(cosnt *)[3]

转载地址:http://nkcia.baihongyu.com/

你可能感兴趣的文章
uva 11806 Cheerleaders (容斥)
查看>>
[HAOI2012]音量调节
查看>>
week07 codelab02 C72
查看>>
ubuntu系统备份与还原
查看>>
人无股权不富
查看>>
JavaScript屏蔽Backspace键
查看>>
dom4j的安装
查看>>
graphical Layout调大一点
查看>>
Python中使用lambda函数
查看>>
句柄类的应用中减少重复编译的方法
查看>>
dj cookie与session 2
查看>>
协程和异步io
查看>>
Java流程控制
查看>>
去除重复的邮箱
查看>>
杭电1018-Big Number(大数)
查看>>
java调用com组件将office文件转换成pdf
查看>>
LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
查看>>
JQuery zTree v3.2和demo
查看>>
C语言中的循环语句
查看>>
湖南省第6届程序大赛第二题 弟弟的作业
查看>>