C++复习day01

打印 上一主题 下一主题

主题 546|帖子 546|积分 1638

这篇博客主要复习C语言的数组和指针

1.指针数组和数组指针

问:指针数组和数组指针,哪一个是指针,哪一个是数组?
我们来类比一下,整型数组是存放整型的数组,那么指针数组就是一个存放指针的数组,自然而然,数组指针就是一个指向数组的指针
  1. #include <iostream>
  2. int main()
  3. {
  4.         int a = 1, b = 2, c = 3;
  5.         int* p1 = &a, * p2 = &b, * p3 = &c;
  6.         int* arr[] = { p1,p2,p3 }; //指针数组
  7.         int** ptr = arr; //数组指针
  8.         return 0;
  9. }
复制代码
2.函数指针

这个有点特殊,以是单独拿出来做一下介绍
首先,函数指针变量应该是⽤来存放函数地址的,将来通过地址可以或许调⽤函数的。这个函数一定是有地址的
  1. #include <iostream>
  2. void solve()
  3. {
  4.         std::cout << "今天是复习C++的第一天" << std::endl;
  5. }
  6. int main()
  7. {
  8.         std::cout << solve << std::endl; //00C3137A
  9.         std::cout << &solve << std::endl; //00C3137A
  10.         return 0;
  11. }
复制代码
可以发现,对函数名取地址和原来的函数名效果相同——也就是说函数名就是地址,同样取函数的地址也可以利用“&函数名”的方法,二者是等效的
提出问题:那么什么叫做函数指针?
回答:顾名思义,就是一个指向函数的指针,请看“VCR”
  1. int (*pf) (int x, int y)
  2. | | ------------
  3. | | |
  4. | | pf指向函数的参数类型和个数的交代
  5. | 函数指针变量名
  6. pf指向函数的返回类型
  7. int (*) (int x, int y) //pf函数指针变量的类型
复制代码
下面来举一个例子
  1. #include <iostream>
  2. int add(int x, int y)
  3. {
  4.         return x + y;
  5. }
  6. int main()
  7. {
  8.         //以add()函数为例
  9.         int (*p)(int, int) = add;
  10.         std::cout << p(1, 2) << std::endl; //3
  11.         std::cout << (*p)(1, 2) << std::endl; //3
  12.         return 0;
  13. }
复制代码
下面来看,两个比力难的例子,尽量去分析一下
  1. (*(void (*)())0)();
  2. void (*signal(int , void(*)(int)))(int);
复制代码
  1. 来分析一下,首先是第一个式子
  2. (void (*)())很明显是一个函数指针类型,意思就是把**int**类型的0强制转化为一个函数指针类型,然后对它解引用,并且调用它
  3. 第二个例子
  4. signal的第一个参数的int类型,第二个参数是”void(*)int的函数指针类型“,signnal的返回值也是“void(*)int的函数指针类型”,如果typedef void(*func)(int),之后就相当于func signal(int,func)
复制代码
3.const和指针

const和*的位置差异,会有不一样的效果,他们被称作是指针常量,常量指针
  1. #include <iostream>
  2. int main()
  3. {
  4.         int a = 1, b = 2;
  5.         const int* p1 = &a;
  6.         int const* p2 = &a;
  7.         int* const p3 = &a;
  8.         p1 = &b;
  9.         p2 = &b;
  10.         //p3 = &b; 这个会报错,因为p3是指针常量,指针的指向不能修改,但是指针指向的值可以修改
  11.         //*p1 = 100;
  12.         //*p2 = 100; 这两个会报错,因为p1,p2都是常量指针,指针的指向可以改变,但是指针指向的值不能改变
  13.         *p3 = 100;
  14.         return 0;
  15. }
复制代码
4.sizeof,数组,指针

数组名的意义

  • sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩。
  • &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址。
  • 除此之外所有的数组名都表⽰⾸元素的地址。
  1. #include <iostream>
  2. int main()
  3. {
  4.         int arr[] = { 1,2,3,4,5 };
  5.         int* ptr = arr;
  6.         std::cout << "sizeof(arr) = " << sizeof(arr) << std::endl;
  7.         std::cout << "sizeof(ptr) = " << sizeof(ptr) << std::endl;
  8.         return 0;
  9. }
复制代码
5.sizeof和strlen的区别

sizeof:在学习操作符的时间,我们学习了 sizeof , sizeof 计算变量所占内存内存空间⼤⼩的,单位是
字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据
strlen:strlen 是C语⾔库函数,功能是求字符串⻓度。
sizeof 和 strlen的对⽐
sizeofstrlensizeof是操作符strlen是库函数sizeof计算操作数所占内存的⼤⼩,单位是字节srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数不关注内存中存放什么数据关注内存中是否有 \0 ,如果没有 \0 ,就会持续今后找,可能会越界
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表