[札记]《C指针编程之道》Continued

第一章    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;   配套使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值