Linux C编程 学习笔记3

我杨南北又回来了!

---------------------------------------

指针与数组:

数组名实际上就是指向数组第一个元素的指针,就是说,数组名也是一个指针!!!

int a[]={2,4,6,8,10};

int *p = a;

int *p2=&a[0]'

指针p1指向数组a的第一个元素,指针p2也是如此,指针变量p1和p2存放的都是a【0】的地址。

如若要指向另一个数组元素(在数组范围内),只需要在指向数组的每个元素的指针上加上或减去一个整形数值,p++就指向了数组的第二个元素a[1];

实验:用不同的方式输出数组的所有元素:

这第三种方式是我没有用过的,指针用的实在是太少了。

值得一提的事不能对数组名执行++操作,a++事不合法的,这是因为a是数组名,他是数组的首地址,是一个常量!!!

 

数组元素也可以是指针类型,这种数组称为指针数组,即指针数组的每一个元素都是指针变量。

例:int *p[5];

*的优先级低于运算符[],所以p咸鱼【5】结合,形成p[5],p[5]是一个数组,然后再与*结合,表示数组元素的类型为指针,每个数组元素都指向一个整形变量。这里p就是一个二级指针。

数组本身就是一个指针了,*p【】是指向数组的指针,是指针的指针。

实验:

 

解释和我想的差不多:

 

值得一提的事

int (*p)[5],这是指向一维数组的指针

int  *p[5],这是一个指针数组,长度为5,数据中每一个元素指向一个整形变量

 

#include<stdio.h>
int main()
{
	int a[2][5]={1,3,5,7,9,2,4,6,8,10};
	int (*p)[5],i;
	p=a;
	for(i=0;i<5;i++)
	{
		printf("%d ",(*p)[i]);
	}
	printf("\n");
	
	p++;
	for(i=0;i<5;i++)
		printf("%d",(*p)[i]);
	printf("\n");
	
	return 0;	
}
//指针指向数组测试

 

关于指针数组,数组指针,数组的区别于联系今天只是稍微复习了一下,还不能完全地理顺。贴别人说郝斌老师的指针视频很顶,等这阶段几个项目忙完了一定要看一看。

 

---------------------------------------------------

指针与函数:指针作为形参与一般的形参有什么区别?指针传值的时候有什么注意点?一般来说指针与函数的结合在什么时候应用较多?

对于指针型形参,实参也可以是NULL,所以在调用函数,给变量开辟内存时,需要进行确认,指针是否为NULL,否则会出现空指针的问题。

返回指针的函数:

函数可以返回正兴致、字符型值、自然也可以返回指针,即返回地址。返回指针的函数一般定义为:

类型名*函数名(参数表);

例如: int *f(int i,int j);

这类我看的太少啦!

 

指向函数的指针实验:

#include<stdio.h>
#define GET_MAX 0
#define GET_MIN 1

int get_max(int i,int j)
{
	return i>j?i:j;
 } 

int get_min(int i,int j)
{
	return i>j?j:i; 
}
int compare(int i,int j,int flag)
{
	int ret;
	int (*p)(int,int);//p是指向函数(名)的指针,两个数谁大就把对应的函数名赋给p
	
	if (flag==GET_MAX)
		p=get_max;
	else
		p=get_min;
		
	ret = p(i,j);
	
	return ret;
}

int main()
{
	int i=5,j=10,ret;
	
	ret=compare(i,j,GET_MAX);
	printf("The MAX is %d\n",ret);
	
	return 0;
}

 

新奇的思路,以前从没见过赋给指针函数的形式。

值得注意的是不能对指向函数的指针做任何的运算,例如p++,p--。

既然函数的参数可以是指针,name自然也可以是指向函数的指针,同时也可以有返回函数指针的函数。

返回函数指针:

#include<stdio.h>
//返回函数指针 
int get_big(int i,int j)
{
	return i>j?i:j;
 } 

int (*get_function(int a))(int,int)//一个返回函数指针的函数
{
	printf("the number is %d\n",a);
	return get_big;
}

int main()
{
	int i=5,j=10,max;
	
	int  (*p)(int,int);
	p=get_function(100);
	
	max-p(i,j) ;
	printf("The MAX is %d\n",max);
	return 0;
}

不是很懂。。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值