C语言:指针

指针是什么?

便于个人理解,指针就是变量的存储地址。一个变量的地址称为该变量的“指针”

指针变量

类型名 * 指针变量名:使用’*'表示该变量是指针变量。
定义:专门用来存放一个变量的地址(指针)。
类型名(基类型):必须与指针变量指向的变量类型相同,不可单独存在。
获取变量的指针:

//输出指针
int a = 100;
//指针变量声明:*pointer是一个指向整型的指针变量
int *pointer = &a;
//输出指针
printf("指针=%d",*pointer);
//也可以这种写法,声明时必须有*,赋值时可没有*,使用时必须有*
int * pointer_2;
pointer_2 = &a;
//通过指针给a变量赋值
*pointer_2 = 3;

指针操作数组

数组的操作,可以直接通过变量名[下标]访问,但是通过指针操作,会让程序更高效。并且,通过指针访问数组,可以防止下标越位的错误,但是应尽量避免出现这种情况。

int a[10] = {1,2,3,4,5,6,7,8,9};
int * p ;
p = &a[0];
p = a;

上面示例中,p = &a[0] 等价于 p = a。 p = a 不是讲数组的地址赋值给p,而是将数组第一个元素的地址赋值给p。还应注意的是,指针赋值单独赋值时,应该是 p = &a[0],而不是 * p = &a[0],使用指针变量指向的值时使用*p。

当指针指向数组时,指针可以进行+/-/++/–运算,此时的运算,是指将指针指向下一个/上一个元素。并且,当两个指针变量指向同一个数组时,两个指针相减也是有意义的,结果表示两个指针指向的元素之间的距离(下标差值)。
int a[5] = {1,2,3,4,5};
int * p1 = &a[2];
int * p2 = &a[4];
//此处结果表示p1和p2代表的元素之间的相差几个元素
p2 - p1;
指针引用数组的两种方式
int a[5] = {1,2,3,4,5};
//将数组a的第一个元素的变量的地址赋值给p
int * p = a;
//下标法
printf("%d",a[1]);
//指针法
*( p + 1 );//下标为1,第二个元素的值
*( a + 2 );//下标为2,第三个元素的值

//简单实例:p1<(a+10)是通过地址的变化来控制for循环的次数
for(p = a ; p < (a+10) ; p ++ )
	printf("%d",*p);

以上代码中,通过指针变量p循环数组,效率比通过下标遍历数组要高。因为,通过下标遍历数组,实际上还是需要通过下标去计算地址,但是指针是直接指向元素的地址,省却了通过下标计算地址的时间,所以效率上要高于下标访问。

二维数组的引用

引用二维数组中特定元素:i*m+j,详见代码。
需要注意的是:int (* p)[4]声明指向一维数组的指针变量,* (p+2)+3的值与(p+2)+3不同,* (p+2)+3指的是a[2][3],而(p+2)+3指的是a[5]。

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int b[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int * p = a[0];
for(p = a[0] ; p < (a[0]+12) ; p ++){
 	printf("%d",*p);
}

//引用特定元素
p=a[0];
for(int i = 0 ; i < 3 ; i ++){
    printf("%d",*(p+(i*4+2)));
}

//指针变量数组
int (*p1)[4] = a;//表示一整个子元素。此时p1+1,表示第二个子元素(a[1]),而不是第一个元素的第二个元素(a[0][1])。

指针引用字符串

char *p = "i love china";
printf("%s",p);
printf("%s",p[2]);//输出第3个元素
p = "i am chinese";
//p[2] = "s";//错误,不可改变
//指针变量p就相当于字符串的引用
//指针变量P可以重复赋值

//字符变量声明字符串
char str[5] = "abcde";
char charts[14];
//charts = "abcde";//错误
charts[1] = "a";//正确

函数指针

类型名 (* 指针变量名 ) (函数参数表列);
例如:int ( * p ) ( int , int ),表示声明一个指针变量p,该变量只能指向函数返回值为整型并且有两个整型参数的函数。
重要用途就是,将函数指针当成一个参数传递给另外一个函数。

int max(int a, int b){
	//todo
}
int (*p)(int, int);
p = max;

返回指针的函数

类型名 *函数名(参数列表) ; 定义一个返回值为指针的函数,返回的指针的类型就是“类型名”所指定的。
使用思路:
从二维数组中获取指定的元素,然后再遍历这个元素的子元素。

//指针函数
int *getElement(int (*arr)[3],int index){
	int *element;
	element = *(arr + index);
	return element;
}

//...
int arr[][3]={{1,2,3},{4,5,6},{7,8,9}};
int *numArr = getElement(arr,1);
//...

指针数组

//int指针数组
int * p [4];
//指向数组的指针
int (*p)[4];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值