本文为笔者在学习和使用C/C++时遇到的一些问题,在此总结记录下来。篇内借鉴了很多文章,也加上了一些自己的想法,如有不妥之处,还请不吝赐教!
- 引用和指针的区别:
1 | 创建时: 引用创建的时候必须要初始化,指针不必。 |
---|---|
2 | 存储时: 引用不占内存空间,指针在栈中占用空间。 |
3 | 特 点: 引用是变量或对象的别名。 |
4 | 指 向: 指针可以改变指向对象,引用不可以!!! |
5 | 注意 !: 引用不能指向空值。 |
int main()
{
int a = 10, b = 20, &p = a;
p = b;
printf("a=%d b=%d p=%d\n", a, b, p);
return 0;
}
//输出是: a=20 b=20 p=20.
//并不是p指向了a,而是把b的值赋给了a
常引用&引用详解:送上一篇好文章@觅思.澈
- const修饰符几种用法
int const a
| 表示a是一个常量 |
const int a
| 同上 |
int *const a | 表示a是一个指针常量,必须进行初始化(拒绝改写、only read) |
int const *a | 可以改变指向的对象,但不能直接改变其指向变量的值 |
const int *a | 同上 |
int const &a | 表示a是一个常引用,不能改变a中的值 |
const int &a | 同上( 注:没有 int &const a这种写法) |
const还可以修饰成员函数为
常成员函数,此类函数不能修改成员变量的值。
总结: const int 与 int const 等价,const在谁前面就是修饰谁。
- C/C++运算符优先级
- 指针函数与函数指针
指针函数 | int *func( int a) | 指针函数是返回值为指针的函数。 |
---|---|---|
函数指针 | int ( *f)( int a) | 函数指针是一个指针,它指向一个函数。 |
由于()运算的优先级高于 * ,所以函数名先结合(), 再结合 int *
int max( int a, int b) {
return a>b?a:b;
}
int min( int a, int b) {
return a<b?a:b;
}
int main()
{
int (*func)( int a, int b);
func = max;
printf( "%d\n", func( 5, 3));
func = min;
printf( "%d\n", func( 5, 3));
return 0;
}
// 输出结果: 5 3
// func指针两次分别指向不同的函数.
- 内存分配和管理函数
void *calloc( size_t num, size_t size) | 分配一块指向num的size长度的数组空间,并进行初始化 |
void *malloc( size_t size) | 分配指向一个大小为size的空间,如果错误则返回NULL |
void *realloc( void *ptr, size_t size) | 将ptr指向的空间改为size大小,如果错误则返回NULL |
void free( void *ptr) | 释放ptr指向的空间,以供以后使用 |
注意!以上分配的空间在逻辑地址上都是连续的,在物理空间上不一定连续。
- 形参和实参( 指针作为参数)
这篇文章写得很详细: 指针参数@DayThinking
简单来说,除引用外,其它传入的实参都需要copy一份进行函数调用。
- C++内存布局
堆 | 由程序员进行请求分配和自主释放(使用内存非配函数) |
---|---|
栈 | 由系统分配回收,用于储存局部变量(空间较小) |
自由存储区 | 使用 new/delete 进行分配的空间 |
常量存储区 | 存储常量数据 |
全局/静态存储区 | 存储全局变量与静态变量 |
传送到下一篇:
C/C++常见问题笔记 2
const还可以修饰成员函数为常成员函数,此类函数不能修改成员变量的值。