zoukankan      html  css  js  c++  java
  • 數組和指針

    int* ap[15] ;15個到int的指針的數組.

    int(*fp)(char*);到函數的指針,這種函數以char*爲參數,返回int.

    int* f(char*);有一個char*參數的函數,返回一個到int的指針.

    char c='a';

    char* p=&c;//p保存着C的地址

    char c2=*p; //c2=='a'


    數組元素的個數必須是常量表達式.常量表達式,即一些簡單表達式,它們能在程序連接和運行之前由編譯器求值.變化的界可以用vector

    void f(int i)

    {

    int v1[i]; //錯誤 數組大小必須是常量表達式

    vector<int> v2(i); //OK

    }


    不存在與數組初始化相對應的數組賦值.


    一個字符串文字量裏包含的字符個數多一個' '


    一個數組的名字能夠被用做到它的開始元素的指針.

    數組名到這個數組的開始元素的指針的隱式轉換,不存在從指針到數組的隱式轉換.


    Void fp(char v[])

    {

    for(char *p=v;*p!=0;p++)

    use(v[i]);

    }



    如果從一個指針減去另一個指針,結果就是這兩個指針之間的數組元素的個數(一個整數).


    Int v2[10];

    int* p1=v2+2;//p1=&v2[2]


    指針相加沒有意義,因此是不允許的.


    Const 實際上改變了類型,它限制了對象能夠使用的方式,並沒有描述常量應該如何分配.const 最常見的用途是作爲數組的界和作爲分情況符號.




    const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 

    事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。 
    Bjarne
    在他的The C++ Programming Language里面给出过一个助记的方法: 
    把一个声明从右向左读。 

    char * const cp; ( *
    读成 pointer to ) 
    cp is a const pointer to char 

    const char * p; 
    p is a pointer to const char; 

    char const * p; 
    同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。 


    C++
    标准规定,const关键字放在类型或变量名之前等价的。

    const int n=5;    //same as below
    int const m=10;

     

    const int *p;    //same as below  const (int) * p
    int const *q;    // (int) const *p

     

    char ** p1; 
    //    pointer to    pointer to    char 
    const char **p2;
    //    pointer to    pointer to const char 
    char * const * p3;
    //    pointer to const pointer to    char 
    const char * const * p4;
    //    pointer to const pointer to const char 
    char ** const p5;
    // const pointer to    pointer to    char 
    const char ** const p6;
    // const pointer to    pointer to const char 
    char * const * const p7;
    // const pointer to const pointer to    char 
    const char * const * const p8;
    // const pointer to const pointer to const char

     

    说到这里,我们可以看一道以前Google的笔试题 :

    [题目]const char *p="hello"; //p--->const char “hello”
           foo(&p);//
    函数foo(const char **pp) //pp 的指針的指針指向const cha
    下面说法正确的是[]
    A.
    函数foo()不能改变p指向的字符串内容
    B.
    函数foo()不能使指针p指向malloc生成的地址
    C.
    函数foo()可以使p指向新的字符串常量
    D.
    函数foo()可以把p赋值为 NULL.

    至于这道题的答案是众说纷纭。针对上面这道题,我们可以用下面的程序测试:

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdio.h>


    void foo(const char **pp)
    {
    //    *pp=NULL;
    //    *pp="Hello world!";
            *pp = (char *) malloc(10);
            snprintf(*pp, 10, "hi google!");
    //       (*pp)[1] = 'x';

    }

    int
    main()
    {
        const char *p="hello";
        printf("before foo %s/n",p);
        foo(&p);
        printf("after foo %s/n",p);
        p[1] = 'x';

        return;
    }



    结论如下:

     

    1. foo函数中,可以使main函数中p指向的新的字符串常量。

    2. foo函数中,可以使main函数中的p指向NULL

    3. foo函数中,可以使main函数中的p指向由malloc生成的内存块,并可以在main中用free释放,但是会有警告。但是注意,即使在foo中让p指向了由malloc生成的内存块,但是仍旧不能用p[1]='x';这样的语句改变p指向的内容。

    4. foo中,不能用(*pp)[1]='x';这样的语句改变p的内容。

          所以,感觉gcc只是根据const的字面的意思对其作了限制,即对于const char*p这样的指针,不管后来p实际指向malloc的内存或者常量的内存,均不能用p[1]='x'这样的语句改变其内容。但是很奇怪,在foo里面,对p指向malloc的内存后,可以用snprintf之类的函数修改其内容


    ---轉自http://blog.csdn.net/yingxunren/article/details/3968800


    const char *char *const的区别

    char * const   [指向字符的静态指针]

    英文const pointer to char ]

    const char * [指向静态字符的指针]

    [pointer to const char]

    char * 这个太简单了,不说了

    那么现在东西很明显了,什么可以改变什么不可以

    很明显,第一种指针是不能变的,as it is const

    第二种指针可以变,但是字符不能变,它是const char

    它的好处是参数不易出现问题,有很好的稳定性。

     

    摘自:大家看看:const char* const GetName(const char* pUser) const中四个const的用法


     
    1
    const修饰一个变量,是表名这个变量不能被修改。如果放在成员函数前面是表名成员函数的返回值不能被修改,如果是修饰成员函数的形式参数,则表名这个参数在函数中不能被修改。        
    2
    )当const放在函数的最后面时表明这个成员函数是“只读”函数,不能修改它设计的所有类成员对象。  
     
    第一个const是表示返回一个字符指针常量  
    第二个是表示成员函数的返回值不能被修改,正好与第一个相符  
    第三个const表示这个参数在函数中不能被修改  
    最后一个就是成员函数是“只读”函数,不能修改它设计的所有类成员对象

    char *pA;

    ....

    const char *pB = pA;

    没问题!

     

    char **ppA;

    ...

    const char **ppB = ppA;

    无法从“char ** ”转换为“const char ** ”!!!

     

    ppA是一个指向char *的指针, ppB是一个指向const char *的指针,根据最前面的试验,const char *char *是相容的,char* 可以转换为const char *,但是相容性不能传递,编译器就不知道const char **char **之间有什么联系了,呵呵.


    摘自:http://5117754.blog.51cto.com/5107754/886636


    char *const p 修饰指针为常量 指针指向内容可以是变量~p++这样的操作不合法 *p='3' 合法
    const char * p p指向的内容是常量~p是变量~
    ~p++合法  *p='3' 不合法

    摘自百度知道.

     

    char 为字符类型,这个没错
    string 只能是装char类型的一个容器类类型,实例了它以后,它就是一个容器,可以用它来装字符.
    string 当作是字符串和字符串类型都是不准确的
    打个比方:
    string *p=new string("123456");
    意思为实例了一个字符容器,它里面装的为"123456".
    此时p的值跟它里面字符串的首的地址值不相等,所以可以判断它不是字符串,如果想获取它字符串的首地址可以这样: p->c_str();
    所以别用学的英语来判断编程里面的概念东西
    如果是这样 vector<int> rec; 难道这个就是所谓的整型串
  • 相关阅读:
    20200503:对象头具体包括什么
    20200504:对象怎么定位
    [WC2006]水管局长
    [HNOI2010]弹飞绵羊
    [国家集训队]Tree II
    [SDOI2008]洞穴勘测
    [SDOI2011]染色
    [BZOJ2959]长跑
    LCT感性瞎扯
    [BZOJ4998]星球联盟
  • 原文地址:https://www.cnblogs.com/huhaibo/p/3352580.html
Copyright © 2011-2022 走看看