指针笔记

来源:互联网 发布:cp linux 直接覆盖 编辑:程序博客网 时间:2024/06/11 22:07

C语言相关:

一、

1.1 C程序运行时,程序的内存分布为:


函数中的局部变量分配在栈中,由程序员手动分配的内存分配在堆中。栈中地址由上往下分配,堆中地址由下往上分配。且堆空间大于栈空间。

1.2 在栈中分配数组时,数组的首地址在低位,其后的元素地址依次往上涨。

int x[5]={10, 20, 30};

表示数组有3个元素,分别为x[0]、x[1]、x[2],其所对应的内存地址为&x[0]、&x[1]、&x[2]或x、x+1、x+2.

由于数组的名称表示该数组第一个元素的地址,也就是x等同于&x[0],请不要在已表示数组名前加&,因为x与&x等价.

 

1-3 对于数组x[ ][ ][ ],每前一阶的值均指向后一阶的起始地址值,

x->[ ][ ][ ]

x[ ]->[ ][ ]

x[ ][ ]->[ ]

 

三、

3-1 指针变量(pointer variable):值为内存地址的变量。数组的名称,表示这个数组的第一个元素的地址,所以它也是指针,而且与指针变量不同,我们称数组名为指针常量(pointer constant)。

指针变量与指针常量的不同之处在于,前者可以使用递增(++)或递减(--)运算符来递增或递减指针;但后者不行。因此,如果在程序中使用arr++或arr—(arr是数组名),就会出现错误信息(因为会改变arr)。

 

3-2 int j[2][3]={0,1,2,3,4,5}; 其中j[0]和j[1]等同于j和j+1,表示第1行第1个元素和第2行第一个元素。j和j[0]虽然表示同一个元素的地址,但两者对于加1个单位的意思不同。

j+1表示第2行第1个元素的地址,即j+1=&j[1][0];而j[0]+1是第1行第2个元素的地址,即j[0]+1=&j[0][1].

*j和*(j+1)表示某个元素的地址。虽然对j和*j表示相同的意思,但两者都加1,表示的意义是不同的。

j[x][y]==*(j[x]+y)==*(*(j+x)+y)=**(j+x*y+y)。

 

3-3  指针数组(array ofpointers):首先它是一个数组,数组的元素都是指针,即“存储指针的数组”;

数组指针(apointer to an array):首先它是一个指针,它指向一个数组。

 

3-4 一个指针相当于一维数组。

*ptr[4]和(*ptr)[4]所表示的意义是不同的。(*ptr)[4]是指向数组的指针(pointerto array),表示ptr是一个指针,其实它也可视为是一个二维数组ptr[ ][4].

 

3-7 int main(int argc, char* argv[]){return0;} 了解argc和argv的意义。

原创粉丝点击