數組和指針

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; 难道这个就是所谓的整型串
原文地址:https://www.cnblogs.com/huhaibo/p/3352580.html