字符串问题
1.(string s = c)
char c[] = "e"; char c[] = "e\0"
·c[0] = 'e', c[1] = '\0'。 c[0] = 'e', c[1] = '\0', c[2] = '\0', s.size() 为1
char c[] = {'q', 'w', 'e'} ; char c[] = {'q', 'w', 'e', '\0'};
·s.size() 为11。 s.size() 为3
char c[3] = ""; char c[3] = "qwe"; char c[3] = "qw\0"; char c[3] = "qw"
·s.size() 位0, c[0] = c[1] = c[2] = '\0' 不可行 不可行 s.size() 为2, c[2] = '\0'
char c[3] = {'q', 'w', 'e'}; char c[3] = {'q', 'w', '\0'};
·s.size() 为11. s.size() 为2
总结:
·""形式,字符数组后面会自动填加'\0',且有效的字符串(""里面的字符串)长度必须小于n - 1;
·{}形式,字符数组后面必须手动添加'\0'
·s.size()在遇到'\0'就停止计数
2.extren
普通情况是声明放在xxx.h文件中,定义放在xxx.c文件中。想要用的时候在main.cpp中include"xxx.h";每一个.c文件要用的时候,都include"xxx.h"即可
如果在.h文件中extren int i = 4,那么每次每个.c文件include"xxx.h"都会再定义一次i,产生错误 ld returned 1 exit status|。
·使用普通情况
·在每一个.c文件中删除include "xxx.h",并添加语句extren `````(不推荐,和头文件作用相违背,增加了代码量)
更详细的内容——http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
3.指针
int a[10]
·cout << a << &a << &a[0];以下输出一样,都是地址
string s[10] (怎么输出里面单个字符的地址?)
·cout << s; 输出整个字符串
·cout << s[0];输出第一个字符
·cout << &s[0];输出整个字符串 cout << &s[1];输出第二个字符开始的整个字符串
4.值默认初始化的问题
一:确实在函数体内部的内置类型不会被初始化,但是在main函数里面也没有初始化。和c++ primer里说的不符。
1 void test () { 2 int i; 3 cout << "i= " << i << "。" << endl;4 } 5 6 int main() 7 { 8 test(); 9 }
输出结果为
二:在main函数里面覆盖i的时候,函数体内部的内置类型却值初始化为0了,main里依旧如此
1 void test () { 2 int i; 3 cout << "i= " << i << "。" << endl; 4 } 5 6 int main() 7 { 8 test(); 9 int i; 10 cout << "waii= " << i << "。" << endl; 11 }
输出结果
5.数组形参的问题
1 int main() 2 { 3 int a[4] = {1,2,3,4}; 4 cout << a << endl; 5 int *q = &a[0]; 6 cout << *q++ << endl; 7 cout << *q << endl; 8 cout << *++a; 9 }
line8,错误。说明了,a,&a,&a[0],虽然cout输出一样,但是类型却不同(类型决定了能实现的操作)。
但是cout << *++(&a[0])也不行,讲道理,这个表达式和第line6是一个意思
2
1 int main() 2 { 3 char *c = NULL; 4 cout << c << "x" << endl; 5 char *cc = nullptr; 6 cout << cc << "x" << endl; 7 8 int *i = NULL; 9 cout << i << "x" << endl; 10 int *ii = nullptr; 11 cout << ii << "x" << endl; 12 13 cout << "sadfasga" << endl; 14 } 15 16 / 17 * 在没有第一段代码时,正常输出i和ii的地址,为什么有了第一段,后续什么输出都没有了 18 * i 和 ii 可以输出, 指向空地址, 可以看出 NULL和 nullptr在这里作用一样 19 * 当第一段只有以下代码时,也可以达到和第一条一样的情况 20 * char *c = '\0';
3
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 string s = "qwe"; 7 string cun = "v"; 8 cun [0] = s[0]; 9 cun [1] = s[1]; 10 for (auto w : cun) 11 cout << w; 12 cout << endl; 13 cout << "循环结束1" << endl; 14 cout << "循环结束2" << endl; 15 cout << cun[1]; 16 } 17 18 / 19 * 为什么不可以这样赋值给变量cun 20 * 为什么输出会有乱码,不是都end把所有cout都清空了吗 21 * 为什么最后cun[1], 又可以输出正确, for循环在这里是怎么进行循环的 22 /
指针传递
Q:指针作为函数参数,并想改变指针所指位置的值
A:函数参数形式是 T *a 时,传递的指针指向位置相同,但是却是原指针的副本。(根据下面代码,画了一个示意图,以方便理解。)
想要完成这个可以用以下两种办法
· T *&a --原a传进去
·对*a操作--利用指向位置相同这一点
注意点:在T *a这种情况下,改变指针a要谨慎
/ *最后并不能正常输出4265 */ void jia(ListNode *a, ListNode *b) { if (a) { jia(a->next, b); } else { a = b; } } void shuchu(ListNode *a){ if (a) { cout << a->val; shuchu(a->next); } } int main() { ListNode *a; a = new ListNode(); a->next = new ListNode(); a->val = 4; a->next->val = 2; ListNode *b; b = new ListNode(); b->next = new ListNode(); b->val = 6; b->next->val = 5; add(a, b); show(a); }