第一章 C语言指针
地址如同密码,通过其内容可以解锁。当该地址内容拷贝多份后,也就意味着在配密码锁的钥匙。
存储器的一个字节,又称一个存储单元
一个变量的地址就是它的第一个字节(最低位字节)的地址
Unsigned int (32位中为4字节,64位里是8字节)
Tips: ()、[] -> 右结合
优先级高于
*、& -> 左结合
先结合者,先占有,确定变量本质
根据地址(指针),可以找到存储的数据。
{
指针:地址,常量
指针变量:存储地址的变量。
}
取地址符(&)取值符(*),互为逆运算
Good habit:指针变量必初始化
(指针与整数的加减)e.g.
int n [8] = {1,76,2,3,4,59}; //sizeof(int) = 4
int *p = n; //initialize
cout << p + 3 << endl; //address of n[3]
p += 3;
cout << --p << endl;
Input(DevC++):
0x23fd50
0x23fd5c
0x23fd58
指针变量+1,表示指向下一个特定类型数据的地址(减法同理)
第二章 指针在数组中的应用
物以类聚——数组
同一数组的元素在内存中是连续顺序的。
一维数组:
Int a[3] = {0};
Int *p; //∵一维数组名指向第一个元素的地址
P = a //∴定义一个可以存储普通变量地址的指针变量
Char str[] =“Fuck”;
Cout << str<< endl; //得到第一个字符的地址,到’\0’结束
指针数组:
char *p[3] = {“ni”, “hao”, “ma”};
第三章 指针在函数中的应用
1、(指针传参)以指针为内容的形参,来修改实参
2、函数入口地址
(函数指针)e.g
bool print(void){
cout<< “Fuck me” << endl;
return 1;
}
Bool (*fp)() = print; //函数名就是函数的入口地址
(*fp)();
cout << fp;
Input(Dev C++):
Fuck me
1
指针函数,即返回值为指针类型的函数,int *f(void);
函数指针,即函数入口地址,int (*f)(void);
第四章 指向指针的指针
*从右往左结合。
Int* *p; //p is point to int*
以二维数组为例
Int array[row][colum];
e.g.
int a[3][4] = {
1,2,3,4,
5,6,7,8,
9,11,12,13
};
//二维数组中a[i] (0<=i<row)表示每一行首元素的地址
for (int i = 0; i < 3; ++i){
cout << &a[i][0]<< endl << a[i] << endl;
for (int k = 0; k < 4; ++k)
cout << *(a[i] + k) << endl;
//等价于*(*(a + i) + k);
cout << endl;
}
Input(Dev C++):
0x23fd40
1
2
3
4
0x23fd50
0x23fd50
5
6
7
8
0x23fd60
0x23fd60
9
11
12
13
来自百度百科:
数组指针:数组名(数组首元素的地址)的指针,即数组首元素地址的指针。即是指向数组的指针。Int (*p)[3];
二维数组的数组名是指向第一行数组的首地址(即指向第一个数组首元素的二级地址),我们也叫它行指针。此时二维数组名p的增量以它所指向的一维数组长度为单位;
(值得思考?)①:变量,零维;一维数组,一维;二维数组,二维;……
②:一维数组名为第一个元素的一级地址,二维数组名为第一个元素的二级地址
Test.cpp:
#include<iostream>
usingnamespace std;
int main(){
int a[3][3][3] = {1};
cout << *(*(*a)) << endl<< endl;
a[0][0][1] = 2;
cout << *(*(*(a)) + 1) <<endl;
a[1][0][0] = 3;
cout << *(*(*(a + 1))) << endl;
//数组名是往左脱衣,得地址,降维?
//取元素是往右层层穿衣,得值,升维?
a[0][1][0] = 8;
cout << *(*(*(a) + 1)) <<endl;
//试下5维数组?
int five[5][4][3][2][8] = {0};
five[3][7][3][2][1] = 258;
cout << *(*(*(*(*(five + 3) + 7) +3) + 2) + 1) << endl;
}
[小插曲]:
常量指针:
constint* p; //指向constint类型的地址变量p
指针常量:
int*const p;//指向int类型的地址常量p
注:*左结合,形成新类型,const 修饰p
第五章 指针在数据结构中的应用
动态内存分配:
Void *malloc(unsigned int num_bytes);//分配num_bytes字节
Void*calloc(unsigned num, unsigned size);//分配num*size字节
Void *realloc(void *ptr, size_t size);//重分配
若成功,则返回指向分配的内存空间的指针
若失败,则返回NULL(空指针)
∴使用前,需要判断是否分配成功
动态内存释放:
Void free(void *ptr);
//释放该内存的数据(即无效数据),but ptr仍指向这块内存
∵安全
∴free与 prt = NULL; 配套使用