A Byte of Pointers
2020, May, 25th
这次稍微记录一下C语言里的指针的用法。
指针类型,同整型、浮点型等数据类型类似,是C语言里一种基本的数据类型,不同的是,指针类型存储的数据表示地址。
关于取值运算符和取址运算符,前者返回一个指针变量所存储的地址上的内容,而后者返回变量在内存块上的地址。
举个例子(可能很不恰当),内存块就像是一条街道,街道上的房子从南到北依次用1号、2号等标上门牌号(内存块上面的每一个地址都是用32位的2进制数表示)。
当执行“int a=3;”时,相当于在这个街道上找一个空房子(比如找第233号房子),往房子里面塞一个整型数3,并用名称‘a’标识这栋房子(如“小a之家”)。当执行“&a”取址时,返回的值是233(即小a之家的门牌号)。
当执行“int *b=a”时,相当于在这条街上又找了一个空房子(比如2233号),往房子里塞一个指针型数(&a),并把这栋房子称为“小b之家”(在门牌号为2233的房子里塞了一个值233)。这里,指针变量b的值为233(与整型变量a的值为3的低位相同),执行“*b”时,返回的值为3,即门牌号为233的房子里的住户;执行“b”时,返回的是233(即b的值);执行“&b”时,返回的值为2233(即b住户的门牌号)。
int *p; //声明一个指向int类型的指针,用p标识
int p[3]; //声明一个有三个元素的整型数组
int *p[3];//声明一个指针数组
int (*p)[3];//声明一个指向整型数组的指针
/*注:运算符的结合性:()>[]>* */
int **p;//声明一个指向(整型)指针的指针
int p(int);//声明一个函数:该函数名为p,传入参数为一个整型数,返回一个整型数
int (*p)(int);//声明一个指向某一类函数的指针,该类函数的传入参数为一个整型数,返回值为一个整型数
int *p(int);//声明一个函数,该函数名为p,传入参数为一个整型数,返回一个指向整型数的指针
int (*p[3])(int);//声明一个指针数组,该数组里的指针指向传入int、返回int的函数
/*再复杂的大概我也整不明白了*/ /*2020.5.26th*/
/*下面两种方式的在多数情况下效果相同*/
int p[10]; //声明一个长度为10的整型数组
int *const q=(int *)malloc(sizeof(int)*10);//声明一个指向整型的常量指针,并为其分配连续的10个整型大小的空间
/*数组名在多数时候课看作是const指针类型*/
/*“数组名[下标]”的索引方式和“指针+偏移量”的索引方式是等价的*/
p[3]; //数组名[下标]
*(p+3);//*(数组名+偏移量)
q[3];//指针名[下标]
*(q+3);//*(指针名+偏移量)
两个同类型指针不能做加法,但可以做减法,得到的是偏移量。
(下次记一波&和*运算符)