C语言中指针重要知识点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
?========================================第1页========================================
指针概念知识点
●
变量的地址就是变量的指针。变量的值和变量的地址是不同的概念,变量的值是该变量在内存单元中的数据。
用来存放指针(地址)的变量就称为指针变量。
●
若把某变量的地址赋值给指针变量p,则称指针变量p指向该变量。
●
定义指针变量的一般形式为:类型名 *指针变量名;,其中“*”为说明符,而不是运算符。
●
通常指针变量可以通过以下几种方法获得地址:通过地址运算“&”赋值,指针变量的初始化,
通过其他指针变量赋值用NULL给指针变量赋空值,以及通过调用标准函数赋值。
●
“*”称为指针运算符(单目运算符),也称取内容运算符。当指针变量p指向一个变量x时,
可以用*p的形式存取该变量的值。此时,*p与变量x相互等价。
●
取地址运算符“&”与指针运算符“*”作用在一起时,有相互“抵消”的作用。对于变量x,*&x与x相互等价。
●
若定义了一维数组a和指针变量p,且p=a;,则以下四种表示相互等价:a[i]、p[i]、*(a+i)、*(p+i)。
●
未对指针变量p赋值即p没有指向时,而就对*p赋值,该值就代替了内存中某单元的内容,有可能出现不可意料的错误。
●
一个数组的元素在内存中是连续存放的,数组第一个元素的地址称数组的首地址。
在C语言中,数组名是该数组的首地址,因此,数组名是指针常量。
●
当指针变量p指向数组元素时,p加上一个正整数n,则当前指向为相对p向前移动n个元素的位置
;p减去一个正整数n,则当前指向为相对p向后移动n个元素的位置。
●
假设指针变量p、q指向同一数组,若p指向地址较大元素,q指向地址较小的元素,
则p>q的值为1(真),且p
●
假设指针变量p、q指向同一数组,p-q的值等于p所指对象与q所指对象之间的元素个数,若p>q则取正值,p
●
把字符串常量赋值给字符指针变量,相当于把该字符串常量的首地址赋值给字符指针变量。
●
C语言的二维数组由若干个一维数组构成。若有定义语句:
int a[M][N], i, j;
则以下元素的七种表示相互等价:
a[i][j]、*(a[i]+j)、*(*(a+i)+j)、(*(a+i))[j]、*(&a[0][0]+N*i+j)、* (a[0]+N*i+j)、* (*a+N*i+j)。
●
若有语句:
int a[M][N], i, j, (*pi)[N];则指针变量pi指向“包含N个整型元素的一维数组”。
当pi=a;时,pi+1将跳过N个元素指向下一行,故称pi为行指针,也称pi是(指向一维)数组(的)指针。
若pi=a;
则以下五种元素的表示相互等价:
a[i][j]、pi[i][j]、*(pi[i]+j)、*(*(pi+i)
+j)、(*(pi+i))[j]
●
除了由二维字符数组可以构成字符串数组外,还可以定义一个指针数组,并在定义时用字符串赋初值的方法,
构成一个字符串数组。
●
指向指针的指针变量,经过二次间接存取后才能存取到变量的值。
●
通常用指针数组的每个元素pa[i]指向二维数组a的每行第0列元素的首地址,然后用指向指针的指针变量pp指向指针数组,此时,pp+1指向数组指针pa的下一个元素,也就是 pp+1指向二维数组a的下一行。如果a是二维字符数组,则pp+1指向下一个字符串。
●
当指针变量指向某一结构体变量时,可用下述三种方式之一存取结构体成员(三种方式是等价的):结构体变
量名.成员名、指针变量名->成员名、(*指针变量名).成员名。
●
若p指向数组a,则:
⑴ p++ (或p+=1),使p指向下一元素。
⑵ *p++ 等价 *(p++)。作用是先得到p指向的变量的值(即*p),然后再使p+1→p。
⑶ *(p++)与*(++p)不同。前者为a[0],后者为a[1]。
⑷ (*p)++表示p指向的元素值加1,即(a[0])++
⑸如果p当前指向a数组中第i个元素,则: *(p--)相当于a[i--],先对p进行*运算,再使p自减; *(++p)相当于
a[++i],先使p自加,再作*运算。 *(-- p)相当于a[--i],先使p自减,再作*运算。