[C语言深度解剖】阅读笔记 数组与指针

一、指针的含义

指针就是保存地址的变量

普通变量的值是实际的值

指针变量的值是具有实际值的变量的地址

*单目运算符 用来访问指针的值所表示的地址上的变量 可以放左值也可以放右值

易错点:int*p;//定义了一个指针未赋值,此时指针的值可能表示某一陌生地址,这个地址可能不能写入值,再赋值时就有可能引起程序崩溃

二、数组的有关含义

函数参数表中的数组实际上是指针

sizeof(a)==sizeof(int*)

但是可以用数组的运算符【】进行运算

数组变量是特殊的指针

数组变量本身表达地址int a[10];int*p=a//无需用&取地址

但是数组的单元表达的是变量,需要用&取地址

数组变量是const指针,不能作左值,不能被赋值

数组a 作为右值时其意义与&a[0]是一样,代表的是数组首元素的首地址,而不是数组的首地址。

a 和&a 的区别

a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是 a[0]的 首地址,&a 是数组的首地址

对指针进行加 1 操作,得到的是下一个元素的地址,而不是原有地址值直接加 1。所以,

一个类型为 T 的指针的移动,以 sizeof(T) 为移动单位。

int a[5]={1,2,3,4,5};

&a + 1:取数组的首地址,再加上sizeof(a)==5*sizeof(int)

a+1=a[1]

三、指针与数组

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身 决定。它是“储存指针的数组”的简称。int *p1[10];

数组指针:首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节, 至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。int (*p2)[10];

1.二维数组

char a[3][4];

a[i][j]元素的首地址为:a+ i*sizof(char)*4+ j*sizof(char)。同样,可以换

算成以指针的形式表示:*(*(a+i)+j)

易错点:int a [3][2]={(0,1),(2,3),(4,5)}相当于int a [3][2]={ 1, 3,5};

int a[5][5]; int (*p)[4]; p = a; 问&p[4][2] - &a[4][2]的值为多少?

&a[4][2]按上面的公式计算=&a[0][0]+4*5*sizof(char)+2*sizof(char)

&p[4]=&p[0]+4*4sizof(char)

所以&p[4][2]=&a[0][0]+4*4*sizof(char)+2*sizof(char)

2.二级指针

char **p

指向一级指针的地址

3.数组参数与指针参数

无法向函数传递一个数组,C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。同样的,函数的返回值也不能是一个数组,而只能是指针。

易错点:函数本身是没有类型的,只有函数的返回值才有类型。

实际传递的数组大小与函数形参指定的数组大小没有关系。

void fun(char *p)  void fun(char a[10]) void fun(char a[ ])这三个是等价的

无法把指针变量本身传递给一个函数。

易错点:main 函数内的变量不是全局变量,而是局部变量,只不过它的生命周期和 全局变量一样长而已。全局变量一定是定义在函数外部的。

void GetMemory(char * p, int num)

 {

 p = (char *)malloc(num*sizeof(char)); //malloc 的内存的地址并没有赋给 str,而是赋给了_str。

}

两种办法获取该内存:

1.用return

char * GetMemory(char * p, int num)

 {

 p = (char *)malloc(num*sizeof(char));

return p;

 }

2.用二级指针

void GetMemory(char ** p, int num)

 {

 *p = (char *)malloc(num*sizeof(char));

 return p;

 }

void fun(char a[3][4]); void fun(char (*p)[4]);void fun(char a[ ][4]);这三个声明等价

4.函数指针

char * (*fun1)(char * p1,char * p2);

fun1是一个 指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指 针。

 5.函数指针数组

char * (*pf[3])(char * p);

这是定义一个函数指针数组。它是一个数组,数组名为 pf,数组内存储了 3 个指向函数的 指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。

6.函数指针数组的指针

例:char * (*(*pf)[3])(char * p);

指针指向了一个包含三个元素的数组,数组里面存的都是指向函数的指针

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值