using namespace std;
void main()
{
// 第一种初始化方法
char **p = new char *[ 10];
// 赋值后正常使用
p[ 0] = " aaa ";
cout<<p[ 0]<<endl;
// 值可以改变
p[ 0] = " bbb ";
// 未赋值使用会崩。编译能过。
// cout<<p[1]<<endl;
// 越界赋值,编译能过,运行能过,输出时崩。
// p[100] = "ccc";
// cout<<p[100]<<endl;
// 第二种初始化方法
unsigned int i = 0;
char** pP = NULL;
pP = ( char**)calloc( 128, sizeof( char*));
for (i = 0; i < 128; ++i)
{
pP[i] = ( char*)calloc( 128, sizeof( char));
}
// 这种初始化方法,好像不存在越界。
pP[ 1000] = " ddd ";
cout<<pP[ 1000]<<endl;
}
说点题外话,学习编程应该是先学会用,在使用的过程中慢慢领悟。
对于有点难度的知识点,一下子可能没有办法完全搞清楚。
新手需要源码,留下邮箱索取。
int main(int argc, char **argv)中两个参考的用法
argc,argv 用命令行编译程序时有用。
主函数main中变量(int argc,char *argv[ ])的含义
有些编译器允许将main()的返回类型声明为void,这已不再是合法的C++
main(int argc, char *argv[ ], char *env[ ])才是UNIX和Linux中的标准写法。
argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数
* argv: 字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数
argv[0] 指向程序运行的全路径名
argv[1] 指向在DOS命令行中执行程序名后的第一个字符串
argv[2] 指向执行程序名后的第二个字符串
比如我们编译好了的程序叫hello,你运行./hello ni hao
那么 argc 就是3,
argv[0] ---> ./hello
argv[1] -----> ni
argv[2] -----> hao
也就是说他们是运行程序时所传的参数个数,和参数。
记住了,argv[0] 是程序路径名,就是程序本身,从 argv[1]开始才是参数
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 这个知识易混点之前是看过了,今天做Linux上写GTK程序时又出现个Warning,发散一下又想到这个问题,于是翻起来重嚼一下。
事实上这个概念谁都有只是三种声明方式非常相似:
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
结论:
char * const cp : 定义一个指向字符的指针常数,即const指针
const char* p : 定义一个指向字符常数的指针
char const* p : 等同于const char* p
const char **是一个指向指针的指针,那个指针又指向一个字符串常量。
char **也是一个指向指针的指针,那个指针又指向一个字符串变量。