C++复习15.指针知识

 

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 (*pb)[4]; // 声明的是一个数组指针 ,指向的是一个有 4 int 类型的数组,我们看一下他的大小。
    cout<< "数组指针的大小 pb:" << sizeof(pb) << endl; // 指针大小在32位机上是 4Byte
    cout<< "数组指针的大小 *pb:" << sizeof(*pb) << endl;// 这个(*pb 大小是 16 如果是改成 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 << "**arr is " <<**arr << endl;// arr地址中保存的值 0
    cout << "**(arr+1) is "<< **(arr+1) << endl; // 转向的是下一行 4
    cout << "*(*arr+1) is " << *(*arr +1 ) << endl; //下一个值 1
     对于一维数组:
    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 << "size of *pb " << sizeof(*pb) << endl; //16 指针pb 指向的内容是一个 4个整数的数组,数组的大小是 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] = "sdfg";
      cout << "strlen(a):" << strlen(a) << endl; 
      cout << "sizeof(a):" << sizeof (a) << endl;
     strlen 是一个函数,是在运行期间决定的,他遇到第一个结束计算其大小,返回的是字节数.
     我们使用字符指针的时候,声明一个字符串,默认会在后面加上一个, 使用sizeof的时候,会计算进去。
     char a[6] = "asdf"; strlen(a) = 4; 但是 strlen(a) = 6, sizeof 是计算内存的大小,这个是在编译期间决定的,初始化的时候a声明的是6个字节的大小。
  对于上面那种字符串char a[] = "asdf"; sizeof (a) = 6, 后面还是会加上一个. 但是使用strlen计算长度的时候,就会遇到第一个为止,所以返回的是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;
原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3439338.html