字符型指针
字符型指针就是指向字符型内存空间的指针变量。
#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个元素的数组,这些数组里面存的是指向函数的指针,这些指针指向一些返回值类型为指向字符的指针,参数为一个指向字符指针的函数。
指针数组:是数组,是一个存放指针的数组