數組和指針
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
}
不存在與數組初始化相對應的數組賦值.
一個字符串文字量裏包含的字符個數多一個'\0 '
一個數組的名字能夠被用做到它的開始元素的指針.
數組名到這個數組的開始元素的指針的隱式轉換,不存在從指針到數組的隱式轉換.
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 |
[题目]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> |
结论如下:
-
在foo函数中,可以使main函数中p指向的新的字符串常量。
-
在foo函数中,可以使main函数中的p指向NULL。
-
在foo函数中,可以使main函数中的p指向由malloc生成的内存块,并可以在main中用free释放,但是会有警告。但是注意,即使在foo中让p指向了由malloc生成的内存块,但是仍旧不能用p[1]='x';这样的语句改变p指向的内容。
-
在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; 难道这个就是所谓的整型串