c++代码能力提高(二)

1.指针的定义
类型名 * 指针变量名
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.指针的运算
(1)两个同类型的指针变量,可以比较大小。
地址p1<地址p2 => p1<p2 值为真
地址p1=地址p2 => p1=p2 值为真
地址p1>地址p2 => p1>p2 值为真

(2)两个同类型的指针变量,可以相减
两个T * 类型的指针 p1和p2
p1 - p2 =(地址p1-地址p2)/sizeof(T)

(3)指针变量加减一个整数的结果是指针
p+n :T类型的指针,指向地址:
地址 p+n
sizeof(T)

(4)指针变量可以自增自减
p++,++p:p指向n+sizeof(T)
p–,--p:p指向n-sizeof(T)

(5)指针可以用下标运算符“【】”进行运算
p【n】 等价于 *(p+n)
3.空指针:
地址0不能访问,指向地址0的指针就是空指针。
可以用“NULL”关键字对任何类型的指针进行赋值,NULL实际上就是整数0,值为NULL的指针就是空指针。
4.指针和数组
数组的名字是一个指针常量,指向数组的起始地址
T * a【n】;
1)a的类型是T *
2)可以用a给一个T *类型的指针赋值
3)a是编译时其值就确定了的常量,不能够对a进行赋值

作为函数形参时, T * p和T p【】等价。
输出值为4
在这里插入图片描述
3.指针和二维数组
T a[m][n]
a[i](i为整数)是一个一维数组
a[i]的类型是 T *
sizeof(a[i])=sizeof(T)*N
a[i]指向的地址:数组a的起始地址+ i * N * sizeof(T)
4.指向指针的指针
定义:T ** p
p是指向指针的指针,p指向的地方应该存放着一个类型为T * 的指针
*p的类型是T *
5.指针和字符串:
字符串常量的类型就是char *
字符数组名的类型也是char *
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
strtok的用法好好想想。
6.void 指针:
void *p;
可以用任何类型的指针对void指针进行赋值或者初始化
因为sizeof(void)没有定义,所以对于void *类型的指针p,
*p无定义
++p,–p,p+=n,p+n,p-n等均无定义。
7.内存操作库函数memset
在这里插入图片描述在这里插入图片描述
内存操作库函数memcpy
在这里插入图片描述在这里插入图片描述
8.函数指针:
在这里插入图片描述
在这里插入图片描述
定义形式:
类型名(*指针变量名)(参数类型1,参数类型2…)
例如:
int ( *pf)(int ,char);
表示pf是一个函数指针,它所指向的函数,返回值类型应为int,该函数应有两个参数,第一个是int 类型,第二个是char类型。
在这里插入图片描述

  1. 结构(struct)
    struct Student (){
    unsigned ID;
    char szname[20];
    float FGPA;
    }
    Student 即成为自定义的类型的名字,可以用来定义变量
    Student s1,s2;

两个同类型的结构变量,可以互相赋值。但是结构变量之间不能用“==”,“!=”,“<",">","<=",">="进行比较运算。

一般来说,一个结构变量所占的内存空间的大小,就是结构中所有成员变量大小之和。结构变量中的各个成员变量在内存中一般是连续存放的。

一个结构的成员变量可以是任意类型的,包括可以是另一个结构类型。

结构的成员变量可以是指向本结构类型的变量的指针:
struct Employee(){
string name;
int age;
int salary;
Employee * next;
}

结构变量名.成员变量名
可以双. 当定义结构里面有结构时

结构变量可以在定义时进行初始化:
StudentEx stu={1234,“Tom”,3.78,{1984,12,28}};
struct Date(){
int year;
int month;
int day;
}
struct StudentEx(){
unsigned ID;
char szname[20];
float FGPA;
Date birthday;
}

定义指向结构变量的指针:
结构名 * 指针变量名
StudentEx * pStudent;
StudentEx stu1;
pStudent=& stu1;
StudentEx stu2 = *pStudent;

通过指针,访问其指向的结构变量的成员变量:
指针->成员变量名
或者(* 指针).成员变量名

10.静态变量:
全局变量都是静态变量,局部变量定义时如果前面加了"static"的关键字,则该变量也成为静态变量
静态变量的存放地址,在整个程序运行期间,都是固定不变的
非静态变量(一定是局部变量)地址每次函数调用时都可能不同,在函数的一次执行期间不变。
如果未标明初始化,静态变量会被自动初始化成全0(每个bit都是0),局部 非静态变量的值则随机。
静态变量只初始化一次,只执行一次。
void Func(){
static int n=4;
cout<<n;
++n;
}
int main(){
Func();Func();Func();
}
输出结果是456

在这里插入图片描述
11.标识符的作用域:
变量名,函数名,类型名统称为“标识符”,一个标识符能起作用的范围,叫做该标识符的作用域。
在单文件的程序中,结构,函数,全局变量的作用域是其定义所在的整个文件。
同名标识符的作用域,可能一个被另一个包含。则在小的作用域里面,作用域大的那个标识符被屏蔽,不起作用。

12.变量的生存期:
所谓的变量的生存期,指的是在此期间,变量占有内存空间,其占有的内存空间只能归它使用,不会用来存放别的东西。
而变量的生存期终止,就意味着该变量不再占有内存空间,它原来占有的内存空间,随时可能派做他用。
全局变量的生存期,从程序被装入内存开始,到整个程序结束。

静态局部变量的生存期,从定义它语句第一次被执行开始,到整个程序结束为止。
13.
在这里插入图片描述
14.逗号运算和逗号表达式
a=35,a4 最终结果为60

15.inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单。说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函数,它可以像普通函数一样被调用,但是在调用时并不通过函数调用的机制而是通过将函数体直接插入调用处来实现的,这样可以大大减少由函数调用带来的开销,从而提高程序的运行效率。一般来说inline用于定义类的成员函数。
内联函数具有一定的局限性,内联函数的函数体一般来说不能太大,如果内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。(换句话说就是,你使用内联函数,只不过是向编译器提出一个申请,编译器可以拒绝你的申请)这样,内联函数就和普通函数执行效率一样了。
16.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值