C++与数据结构常见知识点(二)

C++与数据结构常见知识点(一)

30 strlen()与sizeof

strlen只能用char*做参数,且该char数组必须是以’’/0’'结尾的。

数组做sizeof的参数不退化,传递给strlen就退化为指针了。
详细说明可参见: 百度知道: strlen和sizeof有什么区别?

注意:大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 。
所以,sizeof 即使在字符数组没有终止符’/0’ 的时候,也能够计算出数组“长度”的原因,但这里的“长度”实际上是:编译器分配给该数组变量的内存大小!
例如:char chs[] = {‘a’, ‘c’, ‘/0’, ‘z’, ‘3’,‘d’}; // sizeof(chs) = 6; 而strlen(chs) = 2.

Reference
C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别

31 #ifndef/#define/#endif使用详解

头文件被重复引用引起的后果:

有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。

是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?

答案:不是一定要加,但是不管怎样,用#ifnde xxx #define xxx #endif或者其他方式避免头文件重复包含,只有好处没有坏处。个人觉得培养一个好的编程习惯是学习编程的一个重要分支。

下面给一个#ifndef/#define/#endif的格式:

#ifndef A_H意思是"if not define a.h" 如果不存在a.h

接着的语句应该#define A_H 就引入a.h

最后一句应该写#endif 否则不需要引入

Reference
#ifndef/#define/#endif使用详解

32 指针和数组

数组指针和指针数组的区别
https://blog.csdn.net/qq_31504597/article/details/79966023

33 全局变量

c语言工程里其它文件引用全局变量?

工程包含a.c b.c
在a.c文件里有一个全局变量 list
b.c里有一个全局变量 test

问:1、若b.c里的函数要改变a.c 里全局变量的值,可否直接在b.c 里extern list 然后直接调函数修改?

2、a.c 调用b.c里的函数test_change(test)修改test的值
然后a.c再调用b.c里的函数test_show(test)显示test的值,这里的test值是前面test_change修改的值吗?我的意思是,b.c里的全局变量保存在哪里?不需要return给a.c也能保存值吗?

  1. 可以。全局变量本身具有外部链接特性。extern list可以让编译器在编译时暂时用一个临时的标识符表示list,等到链接时去其他链接文件里找到正确的list的定义,并替换掉b.c中使用到的地方,最终相当于b.c中直接使用了a.c中的list。
  2. 如果你的test_change里面确实有修改到的全局的test,那这里的test值就是test_change修改的值。
    全局变量的作用域是整个源程序,它和静态变量一样都统一保存在全局静态存储区。因此对于整个源程序来说(包括a.c和b.c),只有一个test和list,在哪里对它进行修改,效果都是一样的

如何引用一个已经定义过的全局变量,两种方式:

  1. 用extern关键字方式

  2. 用引用头文件的方式

可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。如下例

fu1.h:
#include<stdio.h>
void setone();

fu1.c:
#include"fu1.h"
int i;
void setone()
{
	printf("%d/n", i);
}

*******************
fu2.h
#include<stdio.h>
void settwo();

fu2.c
#include"fu2.h"
int i;
void settwo()
{
	printf("%d/n", i);
}

*******************
test.c
#include"fu1.h"
#include"fu2.h"
int i=36;    多个文件中唯一的一个初始化赋值,因此不会出现连接问题
int main(void)
{
	printf("%d/n", i);
	i =3;
	setone();
	i = 6;
	settwo();
}
运行结果:
36
3
6

34 this指针

C++ this指针

引言

首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。
注意:
this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。this指针的类型取决于使用this指针的成员函数类型以及对象类型,

1、this指针的概念

1.1、定义

在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。

1.2、this只能在成员函数中使用

成员函数默认第一个参数为T* const register this。
(友元函数,全局函数不是成员函数)

1.3、this指针不能再静态函数中使用

静态函数如同静态变量一样,他不属于具体的哪一个对象,静态函数表示了整个类范围意义上的信息,而this指针却实实在在的对应一个对象,所以this指针不能被静态函数使用。

1.4、this指针的创建

this指针在成员函数的开始执行前构造的,在成员的执行结束后清除。

1.5、this指针只有在成员函数中才有定义。

创建一个对象后,不能通过对象使用this指针。也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。

2、this指针的操作

在类的非静态成员函数中返回类对象本身的时候,我们可以使用圆点运算符*,箭头运算符->。

例一:

#include<iostream>
using namespace std;
class A{
 private:
  int x;
 public:
  A(){
   x=0;
  }
  void display(){
   cout<<this<<endl;
   cout<<this->x<<endl;
   cout<<x<<endl;
   cout<<(*this).x<<endl;
  }
};
int main(void){
    A a;
    a.display();
}

输出:

0x70fe40
0
0
0

关于this指针的一个精典回答:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。

35 calloc

函数名: calloc
函数原型:void* calloc(unsigned int num,unsigned int size);
功能:在内存的动态存储区中分配num个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
百度百科

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i, n = 2;
    int *a;
    a = (int*)calloc(n, sizeof(int));
    printf("input %d numbers:\n",n);
    for( i=0 ; i < n ; i++ )
    {
        scanf("%d",&a[i]);
    }

    printf("read the input:");
    for( i=0 ; i < n ; i++ ) {
        printf("%d ",*(a+i));//printf("%d ",a[i])
    }
    free (a);  // 释放内存
    return(0);
}

指针指向的是一连串的空间,其访问方式可以和数组相同对比char* 和char []的访问方式

展开阅读全文

图解数据结构与算法

06-09
限时福利: 1、现在购课,按提示添加助教微信领取 800 元编程大礼包! 2、原价 199 的课程,今日特价仅需 99 元! 课程背景: 如果想要成为一名合格的工程师,前提是一定要有扎实的数据结构与算法基础。作为程序员的核心基础,算法更是在面试中必不可少的一环。 根据市面上的招聘信息显示,超过 90% 的一线公司在招人时都会考察数据结构与算法能力。 所以,我将结合自己多年的数据结构与算法实战经验以及在阿里巴巴担任面试官的经验,从日常应用以及如何解决面试难题的角度,带你从零掌握这项程序员必备的核心技能! 课程详情: 课程内容涵盖了程序员需要掌握的所有常用数据结构与算法知识点!我将分为3大篇章进行讲解。 代码优化篇:如何提高代码运行效率,是所有程序员都会面对的难题!在这篇,我将带你掌握应用算法把“烂”代码优化为高效率代码的方法,让你的代码显得不再那么“Low”。 基础+进阶+实战篇:我将为你讲解 30+ 常用数据结构与算法核心知识点,在每个知识点对应的实战部分,还将带你手写代码完成项目,并解读代码逻辑原理。同时每个知识点下还会穿插与之对应的BAT实战项目和常见面试题精讲。让你轻松将所学应用到工作、面试中去。 面试篇:目前几乎所有一线互联网公司面试时都会考察求职者的算法能力。我将结合我在阿里巴巴的工作和面试官经验,为你拆解大厂高频面试题以及答题方法,甚至直接提高你现场手写算法的能力。 通过这三大内容,相信无论你从事哪个技术方向,在面对代码效率优化以及算法相关问题上,都更加游刃有余! 学习时遇到不懂的怎么办? 购课后添加小助手微信,按提示进讲师答疑社群。 购课后如何领取免费赠送的编程大礼包? 购课后,添加助教微信: csdn590,按提示领取编程大礼包。 如何听课? 1、登录CSDN学院 APP 在我的课程中进行学习; 2、登录CSDN学院官网。
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值