c语言全面解析十个知识点大学生谨记

如题所述

C语言10个小知识了解指针

1.若有代码

int a=10,*p;p是指针:也是一个变量,且是一个只能用来存放地址的变量。

2.若有代码int a=10,*p;p=&a;当执行了上面的代码,会说”p指向了a”,其实就是p指针变量存放了a的地址”

3.两个*的区别,有如下代码:

inta=10,*p;//该处的* 说明p是一个指针变量用来存放地址p=&a;

*p=*p+1;//该处的* 表示p所指的变量中的值即a的值10

总结: 变量定义时的* 说明该变量是一个指针,调用语句中的* 表示指针指向的变量中的值。[此处是比较容易混淆的]

4.int a=10,*p;p=&a;

则:*p=*p+1;//等价:*p +=1; (0)十十

++(*p);

表示的内容相同,都是p所指变量的值+1。

5. *p++和(*p)++的区别是:

等价于* (p++),先获取 p 当前所指元素的值,然后p指针+1(p指针向后移动一个单元,一般用在数组中,普通变量会越界);后者仅仅是p所指变量的值+1。

6.定义变量时

一个*说明该变量是指针,两个*说明该变量是指向指针的指针(存放的是指针变量的地址)

int a=10,*p,**q;p=&a;//p指向a,*p的结果是10q=&p;//g 指向p,*q的结果是p的地址值,**q的结果才是10

7,如果调用函数传递的是地址,那么被调函数中形参就需要使用指针接收,在函数中对指针所指变量值的改变,会影响到调用函数中的变量值。执行结果:如图所示

8.一维数组名和指针的区别,有定义:

int a[10l,*p;

p=a;//合法

因为,一维数组名存的是数组首地址,这样使 p指向了a首地址,也就是第一个元素的地址。a++;/ /不合法

因为a是一个地址常量,开辟了就不能再修改了,一切给数组名字赋值的操作都是非法的。

p++://合法因为p是一个指针,p++表示从当前向后移动了一个位置。

对干上面的定义,a[i]、* (ati)、* (p+i)、p[]都是合法,都是取下标为i的元素值。所以: p++; 是使指针向后移动,(*p) +十是当前所指变量的值内容+1.

9,若有定义:

int a[3][22],*p[3l,iJ;

*p[3]中[优先级[高于*,说明p是一个数组名,前面的*说明该数组中每个元素都用来存放指针,这叫指针数组。

如果p和a产生联系,则只能通过逐个赋值的方式完成,即: for(i=0;i<3;i++)p[] =a[l; //合法

因为a[] 是二维数组中每行的首地址,所以可以存放到p数组中。

但是 p=a;是非法的,因为a是地址,p是数组的名字,并不是指针名下面获取数组元素的方式都是合法的:

*(pl[il+j) *(*(p+i)+j) (*(p+i))lj]

10.若自定义函数的实参是一维数组名,则该函数的首部可以写成: 

fun (int al) fun (int a[M]) fun

(int*a) M表示长度若有自定义函数的实参是二维数组名,则该函数的首部可以写成: fun(int (a)[N])fun(int al[N]) fun(int a[M][N]) M表示行数,N表示列数

若有指针数组作为fun函数的实参,则该函数的首部可以写成:

fun(int *a[M]) fun(int *al) fun(int**a)

温馨提示:答案为网友推荐,仅供参考
相似回答