c++ primer 学习过程中的错误实例和总结

字符串问题

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);
}

 

转载于:https://www.cnblogs.com/Dbbf/p/6897729.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值