一、指针
1.指针是变量的一种,里面是一个地址,通过这个地址找到要找的数据 实质:单元的地址就是指针内容
2. &是取地址的运算符,*是表示指针运算符 例:int *p1,a ; p1=&a; *p1 =3;
3.函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型 作用是将变量的地址传送到另一个函数中
4.指针变量初始化赋值;把一个变量的地址赋予指向相同数据类型的指针变量;
二、指针和变量
1.指针与零值比较 if (n == NULL)或者if (n != NULL)
2.指针变量未赋值时,可以是任意值,是不能使用的,会造成意外错误 而指针变量给NULL值后,则是可以使用的,只是不指向具体的变量
3.指针变量的使用步骤:(1) 定义指针变量;(2)给指针变量赋地址;(3)正常使用指针进行运算
三、指针和一维数组
1.数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址
2.如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素 p+i和a+i都是a[i]的地址 例如 *(p+5), *(a+5)就是a[5]
3.指向数组的指针变量也可以带下标 p[i]和*(p+i)等价
四、指针和字符串
1.两种方法访问一个字符串
(1)用字符数组存放一个字符串,然后输出该字符串 (2)用字符串指针指向一个字符串
2.字符数组和字符串的区别
(1)字符串指针变量本身是一个变量,用于存放字符串的首地址 而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束
(2)对字符串指针方式 char *ps="C Language"; 可以写为:char *ps; ps="C Language";
而对数组方式: char st[]={"C Language"}; 不能写为:char st[20] ;st={"C Language"}; 而只能对字符数组的各元素逐个赋值
(3)当一个指针变量在未取得确定地址前使用是危险的,容易引起错误 但是对指针变量直接赋值是可以的 因为C系统对指针变量赋值时要给以确定的地址
四、函数和指针
1.把函数的这个首地址赋予一个指针变量,使该指针变量指向该函数 然后通过指针变量就可以找到并调用这个函数 我们把这种指向函数的指针变量称为“函数指针变量”
2.所谓函数类型是指函数返回值的类型 在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数
3.int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少
4.int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号
五、指针数组
1.一个数组的元素值为指针则是指针数组 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量
2.指针数组说明的一般形式为: 类型说明符 *数组名[数组长度] 其中类型说明符为指针值所指向的变量的类型
3.&a :指向二维数组的指针 a :二维数组名,指向一维数组a[0],即第0行首地址 a[0] , *(a+0) , *a :第0行第0列元素地址
a+1 , &a[1] :第1行首地址 a[1] , *(a+1) :第1行第0列元素地址 a[1]+2 , *(a+1)+2 , &a[1][2] :第1行第2列元素地址
*(a[1]+2) , *(*(a+1)+2) , a[1][2] :第1行第2列元素的值
4.不要把&a[i]简单的理解为a[i]的物理地址,因为并不存在a[i]这个变量 它只是一种地址的计算方法,能得到第i行的地址 &a[i]和a[i]的值是一样的,但它的含义却不同
&a[i]或a+i指向行,而a[i]或*(a+i)指向列 当下标j=0时,&a[i]和a[i]+j的值相等
*(a+i)只是a[i]的另一种表示形式在二维数组中,a+i=a[i]=*(a+i)=&a[i]=&a[i][0]即它们的地址值是相等的
六、数组指针
1.int a[5][10] 与 int (*p)[5]; 二维数组名是一个指向有5个元素的一维数组的指针常量
2.p=a+i 使 p指向二维数组的第i行 *(*(p+i)+j) —> a[i][j]
3.二维数组形参实际上是一维数组指针变量,即 int x[ ][10] --> int (*x)[10] 变量定义时两者不等价 系统只给p分配能保存一个指针值的内存区;而给a分配2*5*10字节的内存区
七、指向指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量 char **p;p前面有两个*号,相当于*(*p) 显然*p是指针变量的定义形式,如果没
有最前面的*,那就是定义了一个指向字符数据的指针变量 现在它前面又有一个*号,表示指针变量p是指向一个字符指针型变量的 *p就是p所指向的另一个指针
八、main函数
1.main (int argc,char *argv[ ]) argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组
2.argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数);argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址 针数组
的长度即为参数个数
3.void指针类型 ANSI新标准增加了一种“void”指针类型,即可以定义一个指针变量,但不指定它是指向哪一种类型数据