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. hust1010 The Minimum Length

    地址:http://acm.hust.edu.cn/problem/show/1010 题目: 1010 - The Minimum Length Time Limit: 1s Memory Limi ...

  2. spark-sql做ETL时遇到的两个问题

    项目中使用spark-sql来作ETL,遇到两个问题,记录一下. 问题1: spark-sql –master yarn –hiveconf load_date=`date –d ..`  -e 'i ...

  3. Tasks in parallel

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  4. 无密码ssh操作步骤备忘

    需求:A机器无密码登陆到B机器 1.A机器执行   ssh-keygen -t rsa  ,在~/.ssh/下生成id_rsa 和  id_rsa.pub两个文件,其中id_rsa.pub是公匙 2. ...

  5. JVM(3) 垃圾回收器与内存分配策略

    文章内容摘自:深入理解java虚拟机 第三章   对象已死? 1. 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...

  6. iOS开发之JSONKit

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  7. hive union all使用注意

    UNION用于联合多个select语句的结果集,合并为一个独立的结果集,结果集去重. UNION ALL也是用于联合多个select语句的结果集.但是不能消除重复行.现在hive只支持UNION AL ...

  8. Python面试题之Python正则表达式re模块

    一.Python正则表达式re模块简介 正则表达式,是一门相对通用的语言.简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的:此套规则,就是所谓的正则表达式.各个语言都有 ...

  9. TCP/IP原理简述

    TCP/IP与OSI TCP/IP工作在第4层,在TCP/IP协议簇中,有两个不同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议),它们分别承载不同的应用.TCP协议提供可靠的服务,UDP ...

  10. vue2.0中配置文件路径

    在build/webpack.base.conf.js中添加一些代码即可 module.exports = { resolve: { extensions: ['.js', '.vue', '.jso ...