C++复习15.指针知识

4.指针知识
     在Tencent 笔试和面试中都考到了 C/C++中的指针知识,因为自己很不喜欢使用指针,所以才开始学习 Java的,但是现在看来还是躲不掉的,所以这里总结一下指针的知识。
     指针涉及到了数组的问题,一个很容易混淆的知识就是“指针数组”和“数组指针”。
     指针数组,顾名思义,他本身就是一个数组,什么的数组呢?存放的是指针的数组。相对的数据指针,落脚点在指针上,它是一个指向数组的指针。举个例子说明一下:
    int * p[2]; 声明了一个数组,数组的类型是 int类型的指针,也就是说这个数组里面存放的是 int型的指针。表示为 int* p[]是一个更好地理解方式。
     相对应的 int (*p)[2];则是数组的指针,定义了一个指针,指向一个数组。
     因为[] 运算的优先级要高于 *,所以我们需在声明数组指针的时候,使用 ().
     数组指针,也成为行指针, int (*p) [n], p是一个指针,指向一个整形的一维数组,而且这个一维数组的长度是 n,其中 n就是 p的步长,也就是说当 p执行 p+1的时候, p要跨越 n个整形数据的长度。那么,这种数组指针,每一个指针指向的是一个数组,当执行 +1操作之后,指向的是另一个数组,所以一般在多数组中使用。
    int a[3][4]; int (*p)[4]; 声明一个数组指针,指向含有 4个数据的数组;
    p=a; 将二位数组的首地址赋给 p,也就是 &a[0];
     执行完p++;则 p指向的是 a[1] ,所以数组指针也称指向一维数组的指针,亦称行指针。
    个 int 类型的数组,我们看一下他的大小。
    cout<< 位机上是 4Byte
    cout<<  如果是改成 int (*pb)[5];则 sizeof(*pb) =20 = 4*5,他是该数组的大小。
    int arr[3][4]; 其中sizeof(arr) = 48 , 是整个数组的大小。
    cout << "arr size: " << sizeof(arr) << endl; //48
    cout << "arr[0] size :" << sizeof (arr[0] )<< endl; //16
    cout << "arr is " << arr << endl; // 是数组的首地址
    cout << "*arr is " << *arr << endl;// 也是数组的首地址,两者相等
    cout << 
    cout << 
    cout << 
     对于一维数组:
    int arra[5] = {1,2,3,4,5};
    for(int i=0;i<5; i++){
        cout << *(arra+i) << " " ;
        
    } 输出真个数组,我们不可以对 arr进行修改,但是可以利用加减法取数据
     对于二维数组:
    cout << "使用 arr 运算输出整个数组"  << endl;
    for(int i=0;i<3;i++){
         for( int j=0;j<4;j++){
            cout << *(*(arr+i)+j)<< " "; arr + i是改变的行, ( *arr + j) 是列
        }
        cout << endl;
    }
    pb= arr ; 在这里arr是数组的首地址,也就是将二位数组的首地址赋给 p,也就是 arr[0] 或者&arr[0][0]
    cout << "   pb is " <<  pb << endl; // 数组的首地址
    cout << " *pb is " << *pb << endl; // 也是数组的首地址
    cout << "**pb is " << **pb<<endl; //是数组第一个元素
    cout << "size of pb " << sizeof (pb) << endl;// 4  指针的大小
    cout << 个整数的数组,数组的大小是 16, 所以对 pb++ 相当与指向下一行
    cout << "size of **pb " << sizeof (**pb) << endl; //数组中的值
 
       cout << "使用 pb指针输出数据" << endl;
    for(int i=0;i<3;i++){
         for( int j=0;j<4;j++){
            cout << *(*pb+j) << " ";
        }
        cout << endl;
        pb++; // 每加一次,指向的是下一行,指针 pb不可以随便操作,他指向的是是个 int [4] 的指针数组,
    }
 

C/C++ 复习知识 2013.09.13

C/C++ 复习知识 2013.09.13

前言:
    今天是参加西山居笔试,都是C/C++的东西,感觉笔试题还是很坑的,但是反映了自己的基础很差,所以先整理一下自己不会的C++知识.同时今天把实习的工作暂先辞去了,因为要准备找工作,所以未来的话,还是不去了,但是那边的实习交接还真是个麻烦的事情,希望Tibo那边尽量早点找到人来接受这一块的。
     在没节操一下:从公司回来的时候,老爸给我打电话,说“什么时候带个媳妇儿回来啊?人家谁谁带家一个媳妇儿回来”。是啊,也不知道为什么自己一直单身啊?之前三年的时间里,或许是因为心里一直装着一个人,也是因为自己明白自己想要的是什么,大学期间没有时间,但是今年过了21周岁的时候,心里渐渐地腾出了地方,自己也渐渐变得更加理性了。另外爱情是可遇而不可求的,所以只要我自己把状态调整好,做好准备,自然会遇到那个唯一的她,期待爱情中。话说今天还真是遇见好多漂亮的妹子,公交车上遇见一个特清纯的,宣讲会的时候也遇到好几个,算了,不YY了。复习C++了。
 
1.C C++ char []  
     char a[6] = "sd\0fg";
      cout << "strlen(a):" << strlen(a) << endl; 
      cout << "sizeof(a):" << sizeof (a) << endl;
     strlen 是一个函数,是在运行期间决定的,他遇到第一个\0结束计算其大小,返回的是字节数.
     我们使用字符指针的时候,声明一个字符串,默认会在后面加上一个\0, 使用sizeof的时候,会计算进去。
     char a[6] = "asdf"; strlen(a) = 4; 但是 strlen(a) = 6, sizeof 是计算内存的大小,这个是在编译期间决定的,初始化的时候a声明的是6个字节的大小。
  对于上面那种字符串char a[] = "as\0df"; sizeof (a) = 6, 后面还是会加上一个\0. 但是使用strlen计算长度的时候,就会遇到第一个\0为止,所以返回的是2。
  C C++  char * a ;
        char * b = "yangteng";
cout << "sizeof(b) :" << sizeof(b) << endl; //4
cout << "strlen(b) :" << strlen(b) << endl; // 8
cout << "sizeof(*b) : " << sizeof(*b) << endl; // 1 就是一个字符 
     这里的a 是一个指针,指向的是一个字符,类型是一个字符指针,所以sizeof(b) = 4 表示的是指针的大小;
 
 
 
char *str[]={"11111","22222","33333","44444","66"};
     char **    p=  str +  1;
     str[0]=(*  p++)  +2;
     str[1]=*(p+1);
     str[2]=p[1]+3;
     str[3]=p[0]+3;
     cout<<str[0]<<endl;
     cout<<str[1]<<endl;
     cout<<str[2]<<endl;
     cout<<str[3]<<endl;

C++复习15.指针知识的更多相关文章

  1. C语言复习:指针知识

    指针知识体系搭建 指针强化 指针是一种数据类型 指针也是一种变量,占有内存空间,用来保存内存地址 测试指针变量占有内存空间大小:sizeof(指针名); 2)*p操作内存 在指针声明时,*号表示所声明 ...

  2. C语言复习: 二级指针和多级指针

    二级指针内存模型建立 void main2() {     int i = 0;       //指针数组     char * p1[] = { "123", "456 ...

  3. c++面试题中经常被面试官面试的小问题总结(二)(本篇偏向指针知识)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10713204.html 1.利用指针交换两个字符串方法?(这题是我当年读大一的时候看到的,好怀 ...

  4. Java复习1.基本知识

    Java语言概述 20131003 开头语: 开发领域,重要的编程语言基本都是C/C++,然后就是Java, C/C++就不用说了,另外掌握Java对你是有很大的帮助的,而且也会扩宽你的择业范围.同时 ...

  5. [JS复习] JS 基础知识

    项目结尾,空闲时间,又把<JS 基础知识> 这本书过了一遍,温故知新后,很多知其然不知其所以然的内容 豁然开朗. [1. 用于范围的标签] display  :inline or bloc ...

  6. C/C++指针知识整理(一)

    1.指针(变量)的类型 把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型.这是指针本身所具有的类型. (1)int*ptr; //指针的类型是 int* (2) char*ptr;//指针 ...

  7. C++复习5.指针数组字符串

    C/C++ 指针.数组和字符串 本次学习指针.数组.字符串.引用的内存映像. 1.指针 指针的本质:可以执行的程序是由指令.数据和地址组成的.当CPU访问内存单元的时候,不论是读取还是写入,首先要把内 ...

  8. 指针知识梳理6-const与指针

    const 定义的变量为仅仅读变量.在语法层面上通过这个变量去改动内存是不同意的. 可是对于下面代码.就有非常多人绕了: const int  *p1;  //p1能变.*p1不能变 int cons ...

  9. IOS 杂笔-15(知识小点 readonly)

    readonly是我们并不陌生的属性. 但是他也有值得我们注意的地. 属性如其名-只读-也就是说我们只能读取-不能进行写操作 当我们尝试进行写操作时会如下 但是这并不意味着我们不可以改变其内部的属性 ...

随机推荐

  1. 2017 Multi-University Training Contest - Team 1 03Colorful Tree

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6035 题面: Colorful Tree Time Limit: 6000/3000 MS ( ...

  2. apache服务器设置

    服务器目录 目录说明 bin: apache常用的一些命令 cgi-bin:存放一些脚本语言命令 conf:apache配置文件 error:错误记录 htodcs存放站点文件 logs:记录日志 m ...

  3. redis 简单命令操作

    一.概述: 在该系列的前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List.Set.Hashes和Sorted-Set.这些命令都具有一个共同点,即所有的操作都是针对与K ...

  4. SiteMesh使用(2.4.2)

    SiteMesh是一个网页布局和修饰的框架.我理解的是在一个母版页上引入页面各个位置的信息,从而拼接成一个页面展示出来.它定义了一个过滤器,把页面统一加上头部和底部. 我的项目是在springmvc中 ...

  5. Python- discover()方法与执行顺序补充

    可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,让整体结构更加清晰 但通过addTest()添加.删除测试用例就变得非 ...

  6. 关于STM8S使用硬件SPI收发问题

    源: 关于STM8S使用硬件SPI收发问题

  7. 为什么gitHub提交记录显示作者名称是unknow?

    unknow,为什么? gitHub上提交记录显示作者名称是unknow,刚开始没怎么管,后面遇到问题看提交记录时发现有两个unknow(一定有一个人遇到和我一样的问题了,哈哈..),于是解决一下吧. ...

  8. Jquery编历数组

    <html> <head> <title>编历</title> <script type="text/javascript"& ...

  9. 在父页面访问iframe的东西

    playBox是iframe里的元素id

  10. Jquery中val、text、html的区别

    html就是你可以添加像<a></a>.<p></p>等标记text只能写文本如果写了上面的标记则会以文本形式输出val是属性,只有有该属性的对象才能调 ...