c/c++整理--引用和指针(4)

分手后的思念是犯贱 2022-06-18 13:10 240阅读 0赞

一、指针数组和数组指针的区别

解析:

  指针数组指用于存放指针的数组,存放同一类型的指针,例:

  1. int *a[10];

数组a中存放了10个int*型变量,在栈区分配了10个int*的空间,数组存放10个int型数据的地址。

  数组指针指指向一个数组的指针,例:

  1. int *b = new int[10];

指针b指向在堆中分配的10个int型数据大小的内存区,注意,这个时候释放空间一定要delete[],否则会内存泄漏。

二、找错——指针数组和数组指针的使用

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char *str[] = {"Welcome", "to", "Fortemedia", "Nanjing"};
  5. char **p = str + 1;
  6. str[0] = (*p++) + 2;
  7. str[1] = *(p+1);
  8. str[2] = p[1] + 3;
  9. str[3] = p[0] + (str[2] - str[1]);
  10. printf("%s\n", str[0]);
  11. printf("%s\n", str[1]);
  12. printf("%s\n", str[2]);
  13. printf("%s\n", str[3]);
  14. return 0;
  15. }

第六行结束,指针p指向“to”;

第七行结束,str[0]指向“Nanjing”后面的一个元素,但是这个元素不存在,所以str[0]指向NULL,这里要说明一下,*p++中,p++的运算优先于*p,所以p是先自加指向“Fortemedia”,然后加2,指向NULL;

第八行结束,p自身值没有发生变化,str[1]指向“Fortemedia”后的一个元素,即“Nanjing”;

第九行结束,p指向“Fortemedia”,p[1]指向“Nanjing”,p[1]+3即指向“Nanjing”中的第四个元素,str[2]即指向“jing”;

第10行结束,str[2]和str[1]相差三个位置,相减等于3,此时p[0]指向‘j’字符,因此,str[3]即指向‘g’;

这道题我刚开始看的时候陷入了一个误区,怎么想都想不通,最后我将6、7、8、9、10行执行完之后的str都推一下,这样就非常明显了。

推导:

  1. char **p = str + 1; // Welcome, to, Fortemedia, Nanjing P -> to str[1]
  2. str[0] = (*p++) + 2; // NULL, to, Fortemedia, Nanjing P -> Fortemedia str[2]
  3. str[1] = *(p+1); // NULL, Nanjing, Fortemedia, Nanjing P -> Fortemedia str[2]
  4. str[2] = p[1] + 3; // NULL, Nanjing, jing , Nanjing P -> jing str[2]
  5. str[3] = p[0] + (str[2] - str[1]); // NULL, Nanjing, jing , g p -> jing str[2]

输出:

  1. (空)
  2. Nanjing
  3. jing
  4. g

三、函数指针和指针函数的区别

解析:

  指针函数是返回值为指针类型的函数,

  1. 返回值类型* 函数名(形参){函数体}

事实上,每一个函数,即时它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针,比如函数返回一个整数型,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。
  函数指针是指向函数的指针变量,它首先是一个指针变量,其指向了函数地址。

四、数组指针与函数指针的定义

定义下面的几种类型变量:

a、含有10个元素的指针数组

b、数组指针

c、函数指针

d、指向函数的指针数组

  1. a.int* a[10]; b.int (*a)[10]; c.int (*a)(int,int); d.int (*a[10])(int, int);

五、各种指针的定义

写出函数指针、函数返回指针、const指针、指向const的指针、指向const的const指针。

答案:

  1. void (*a)(int, int); //函数指针
  2. void* a(int, int); //函数返回指针
  3. char * const a; //const指针
  4. char const *a; //指向const的指针
  5. char const * const a; //指向const的const指针

六、代码改错——函数指针的使用

  1. #include <iostream> using namespace std; int max(int x, int y) { return (x > y ? x : y); } int main() { int *p; int a, b, c; int result; int max(x, y); p = max; cout<<"Please input three integer"<<endl; cin>>a>>b>>c; result = (*p)((*p)(a, b), c); cout<<"result = "<<result<<endl; return 0; }

第15行,声明max函数方法错误。

第17行,等号两边数据类型不同,p为int*类型,max为(int*)(int,int)类型,不能隐式转换。

更改:

  1. int (*p)(int, int);
  2. int max(int x, int y);
  3. p = &max;

七、看代码写输出——函数指针的使用

  1. #include <stdio.h>
  2. int add1(int a1, int b1)
  3. {
  4. return a1+b1;
  5. }
  6. int add2(int a2, int b2)
  7. {
  8. return a2+b2;
  9. }
  10. int main()
  11. {
  12. int numa1 = 1, numb1 = 2;
  13. int numa2 = 2, numb2 = 3;
  14. int (*op[2])(int a, int b);
  15. op[0] = add1;
  16. op[1] = add2;
  17. printf("%d %d\n", op[0](numa1, numb1), op[1](numa2, numb2));
  18. getchar();
  19. return 0;
  20. }

这里其实很简单,op[2]就是存放了两个函数指针,用于20行输出。

输出:

  1. 3 5

八、typedef用于函数指针定义

下面定义有什么作用?

  1. typedef int (*pfun)(int x, int y);

解析:

定义了一个函数指针,表示其返回值为int类型,且同时带两个int型参数的函数指针类型,可以用这种类型定义函数指针来调用相同类型的函数。

发表评论

表情:
评论列表 (有 0 条评论,240人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++指针引用

    引用 是内存空间另外一个别名,相当于门牌号,可以用它来找到具体的内存空间。 int i = 17; int &b = i; cout << b

    相关 指针引用

    1.指针和引用的差别 (1)非空区别:任何情况下都不能使用指向空值的引用。一个引用总是指向某些对象。如果声明一个变量并让它指向一个对象,但是该变量某些时候可能也不指向任何对

    相关 引用指针区别

    将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对

    相关 指针引用

    1、引用 1. 引用必须初始化 引用就是给对象取一个别名。定义引用,程序把引用和它的初始值绑定在一起(绑定之后不可再绑定其他对象),而不是初始值拷贝引用,为