在C 语言中,指针的意义是重大的,因为指针能够根据一个地址值,访问对应的存储空间从而改变变量的值,这比之前的给变量赋值更加的方便,简洁。
1 变量的使用格式:
变量类型 * 变量名;
* 是指针运算符。访问指针p指向的存储空间。
* p 是指访问指针p 所指向存储空间里的数据。
% p 输出指针里面存储的地址值。
指针变量也是变量所以在使用前一定要先定义,和变量定义差不多要有指针的类型还有指针名。
注意:1>: 指针变量只能存储地址值。
2>:变量名前的类型代表变量只能指向此种类型的数据。
例如:int * p; 代表指针变量p只能指向int类型的数据。
3 >: 清空指针 p = 0 ;
p = NULL;
2:指针初始化和变量初始化基本类似:
例如: # include <stdio.h >
int main ()
{ int a ;
a = 10;
int * p ;
p= &a;
printf (" a = % d \n", *p);
return 0;
}
这行代码运行后所输出的结果就是a 的值 是10, 因此我们知道利用指针也可以间接的取出变量的值。
3:也可以利用指针同时返回多个返回值。
例如: 用一个函数同时返回两个数的和与差。
#include <stdio.h>
int sumandminus(int n1, int n2, *n3);
int main ()
{
int a = 10;
int b = 7;
int sum;
int cha ;
sum = sumandminus(a,b,&cha) ;
// 把变量cha 的地址 给指针变量n3
return 0;
}
int sumand minus (intn1 , intn2 ,int *n3 )
{
*n3 = n1 + n2;
// 改变指针变量n3 的值 cha 的值也就改变了。 间接实现了返回两个返回值的要求。
return n1+ n2;
}
4: 指针指向数组
例如:int arry [5] = {1,2,3,4,5};
int *p;
p=arry;
// 定义了一个指针变量p 并且使p 指向 arry 数组。因为数组名代表数组地址,也是数组首元素的地址。
数组元素的访问方式: 1: 数组名 [下标];
2: 指针变量名 [下标];
3:*(p+i);
指针变量 + 1,究竟加多少,取决于指针变量所指向的类型,因为指针里面存储的是地址,因此指针变量+1 相当于指针指向的地址值加上相应类型在内存中所占的字节数。即指向下一个同类型的数据。例如 int 型相当加上4 ,char 相当于加上 1 .....
任何指针不管是什么类型在内存中都是占据8个字节的存储空间。指针定义类型的作用是为了取值和赋值时知道这个指针取值和赋值的字节范围,从指针变量所指向的地址开始取值或赋值相应的字节。不然取值和赋值无法正确的进行。
5: 指针指向字符串
指针可以指向数组,也可以指向字符串。
例如: char * name = " it";
// 定义一个指针变量name 指向字符串的首字符。
printf (" % c \n", *name);
// 输出一个字符,也就是name的 首字符。
printf ( " %s \n", name );
// 输出整个字符串,name 指针指向的是字符串的地址,也就是首元素的地址。知道遇到\0时字符串结束。
但是指针指向的字符串不能再重新赋值,因为此时他们作为字符串常量存储在常量区。而数组字符串可以修改,因为数组字符串是变量。
例如: char name2 [4]={'i','t','\0'};
name2[0]='T';
是允许的,而*name [0]='T'; 是错误的。
因此数组字符可以使用于内容需要经常修改的场合。
指针字符串使用于 内容不需要修改,并且这个字符串经常使用的场合。
6:指向指针的指针
例如: int a = 10;
int *p;
p= &a;
// 定义一个指针变量P,并且指向变量a 。
int **p2;
*p2=&p;
// 定义一个指针变量p2 ,并且指向指针p。
p2里存放的是指针p的地址,指针p里面存放的是变量a 的地址。
7:返回指针的函数
例如: char test ()
{
return 'a';
}
// 这个函数只能返回一个char 类型的字符a .
char *test2 ()
{return "jack" ; }
// 利用返回指针函数可以返回一个字符串 jacke。
8:指向函数的指针
定义:函数返回值类型 (*变量名) (形参列表);
变量名 = 函数名;
// 定义一个指向函数的指针变量,并且初始化指针变量,使之指向函数地址。
(*变量名)是固定模式,表示一个指向函数的指针。
或者定义时直接初始化:
函数返回值类型 (*变量名) (形参列表)= 函数名;
间接调用函数: 变量名 (形参列表);
函数名(形参列表); // 直接调用
(*变量名) (形参列表);
例如:int sum (int a , int b )
{ return a+ b; }
int (*p) (int , int );
p= sum;
调用函数时可以直接调用: sum (1,2);
间接调用:p (1,2);
(*p)(1,2);
网友评论