指针和引用(4)指向指针的指针

简介: 1.知识点(1)在程序中可以声明指向任何数据类型的指针,指针也可以指向指针类型,成为指向指针的指针。下面是一个使用例子1 int a=10,b=20;2 int *q=&a;3 int **p=&q;4 **p=30;(2)如果想通过指针在被调函数中修改主调函数的变量,必须将主调函变量(务必确定该变量的类型,有时候可能变量本身就是指针,这时候形参就需要是指针的指针了)的地址作为参数,在被调函数中修改主调函数指向的内容。

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<<endl;
5   getchar();
6   return 0;        
7 }

解析: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]
相关文章
|
6月前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
95 9
|
6月前
|
存储 安全 C语言
引用指针
引用指针
36 1
|
5月前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
77 1
|
6月前
|
C++
C++中的const指针与const引用
C++中的const指针与const引用
79 2
|
6月前
|
算法 C语言
通过指针引用数组
通过指针引用数组
56 1
|
6月前
|
算法 C语言
通过指针引用字符串
通过指针引用字符串
67 1
|
4月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
32 3
|
5月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
66 5
|
5月前
|
存储 安全 编译器
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
44 2