c语言指针

字符型指针

字符型指针就是指向字符型内存空间的指针变量。

#include<stdio.h>
#include<windows.h>

int main()
{
	char *str="手机的好看\n";  //定义了字符型指针变量str
	printf("%s\n",str);
	
	system("pause");
	return 0;

}

注意;

这里并不是把字符串放到str中,只是把这个字符串中的第一个字符的地址赋给变量str。

字符串数组

#include<stdio.h>
#include<windows.h>

int main()
{
	int i;
	char *month[]=
	{
		
		"(一月)January",
		"二月 February ",
		"三月 Marcy ",
		"五月 May ",
		"六月 June ",
		"七月 July ",
		"八月 August ",
		"九月 September ",
		"十月 October ",
		"十一月 November ",
		"十二月 December"
	};
	for( i=0;i<12;i++)
	{
	printf("%s\n",month[i]);
	}
	system("pause");
	return 0;

}

指针数组

一个数组,其元素均为指针类型数据,称为指针数组。也就是说,指针数组中的每一个元素相当于一个指针变量。也可以理解为定义了一个数组,而它的每个元素的类型是一个指向字符/字符串的指针数组。

 

数组指针

示例:char (*a)[4]
表示一个指向“一个有4个字符类型元素的数组”的指针。

数组指针:是指针,该指针有能力指向一个数组
元素表示::char (*a)[i] 

int(*p_arr)[3]; //指向含有3个int元素的数组的指针

#include<stdio.h>
#include<windows.h>

#pragma warning(disable:4996)


#define NUM 10


int sum(int *p,int numm)
{
	int i,sum=0;
    printf("所有奇数\n");
	for(i=0;i<numm;i++)
	{
		if(*(p+i)%2!=0)
		{
          printf("%d\n",*(p+i));
		  sum=sum+*(p+i);
		}
	}
	printf("所有奇数之和\n");
	printf("%d\n",sum);
   return 0;
}
int main()
{
	/*Sleep(1000);*/
	int *pointer,a[NUM],i;
	printf("please input\n");
	pointer=a;//指针指向数组首地址
	for(i=0;i<NUM;i++)
	{
		scanf("%d\n",&a[i]);
	}
	sum(pointer,NUM);//调用函数
	system("pause");
}

函数与指针 

每一个函数本身也是一种程序数据,一个函数包含了多条执行语句,它被编译后,实质上是多条机器指令的合集。在程序载入到内存后,函数的机器指令存放在一个特定的逻辑区域:代码区。既然是存放在内存中,那么函数也是有自己的指针的。

C语言中,函数名作为右值时,就是这个函数的指针

 

指针函数

返回值的类型为指针类型。

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

//指针函数是指返回值是指针的函数,即本质是一个函数:

#include<iostream>

using namespace std;

int main()

{

float*find(float(*p)[4],intm);//查询序号为m的学生的四门课程的成绩

float score[][4]={{50,51,52,55},{70,70,40,80},{77,99,88,67}};//定义成绩数组,第一维可以为变量

float*pf=NULL;//定义一个指针时一定要初始化

int i,m;

cout<<"请输入您想查询的学生的序号:";

cin>>m;

pf=find(score,m);//返回为一维数组指针,指向一个学生成绩

for(i=0;i<4;i++)

cout<<*(pf+i)<<"";

cout<<endl;

return 0;

}

float *find(float(*p)[4],intm)

{

float *pf=NULL;

pf=*(p+m);//p是指向二维数组的指针,加*取一维数组的指针

return pf;

}

//指针函数是指返回值是指针的函数,即本质是一个函数:

#include<iostream>

using namespace std;

int main()

{

float*find(float(*p)[4],intm);//查询序号为m的学生的四门课程的成绩

float score[][4]={{50,51,52,55},{70,70,40,80},{77,99,88,67}};//定义成绩数组,第一维可以为变量

float*pf=NULL;//定义一个指针时一定要初始化

int i,m;

cout<<"请输入您想查询的学生的序号:";

cin>>m;

pf=find(score,m);//返回为一维数组指针,指向一个学生成绩

for(i=0;i<4;i++)

cout<<*(pf+i)<<"";

cout<<endl;

return 0;

}

float *find(float(*p)[4],intm)

{

float *pf=NULL;

pf=*(p+m);//p是指向二维数组的指针,加*取一维数组的指针

return pf;

}

函数指针

是指向函数的指针变量。

声明示例:int (*ptr)(int x, int y);

 

int(*p_func)(int,int);   / /指向返回类型为int,有2个int形参的函数的指针

int func(int x);            /* 声明一个函数 */

int (*f) (int x);             /* 声明一个函数指针 */

f=func;                      /* 将func函数的首地址赋给指针f */

或者使用下面的方法将函数地址赋给函数指针:

f = &func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

下面的程序说明了函数指针调用函数的方法

#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int main()
{
    int (*ptr)(int, int);
    int a, b, c;
    ptr = max;
    scanf("%d%d", &a, &b);
    c = (*ptr)(a,b);
    printf("a=%d, b=%d, max=%d", a, b, c);
    return 0;
}

 ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。

函数指针数组指针

char *(*(*pf)[3])(char * p); //pf是一个指针,这个指针指向一个包含3个元素的数组,这些数组里面存的是指向函数的指针,这些指针指向一些返回值类型为指向字符的指针,参数为一个指向字符指针的函数。

 

 

指针数组:是数组,是一个存放指针的数组

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值