指针(二)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

通过指针引用字符串

1.在C语言中字符串是放在字符数组中的,想引用一个字符串一、可以通过以下方式。
(1)用字符数组存放一个字符串,可以通过数组名加上下标引用元素。
(2)用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
例:
int main()
{
char *string = "i am a student";
printf("%s\n",string);
return 0;
}

说明C语言对字符串常量是按照字符数组处理的。
需要注意的是string被定义为一个指针变量,基类型为字符字符型,他只能指向一个字符类型数据,而不能同事指向拖个字符数据,更不是把
"i am a student"这些字符串放到string中(指针变量只存放地址),也不是把字符串赋值给*string,只是把<span style="font-family: 'Microsoft YaHei'; font-size: 12px;">"i am a student"这个字符串的第一个字符的地址赋给指针变量string。</span>
另外通过字符串或者字符指针可以输出一个字符,而对于一个数值型的数组,则不能数组名输出他的全部元素。如:
int a[10];
.
.
.
printf("%d",a);
这样是不行的,他输出的是数组首元素的地址,对于数值型数组只能一个一个的逐个输出。
小练习:
/*
将字符串a赋值为字符串b,然后输出字符串b。
*/

#include<stdio.h>
#include<sttring.h>
int main()
{
	char a[] = "I am a student",b[20];
	int i;
	for(i = 0;*(a+i)!='\0';i++)
	{
	*(b+i)= *(a=i);
	*(b+i)='\0';
	printf("string a is %s\n",a);
	printf("string b is");
	for(i = 0 ;b[i]!='\0';i++)
	printf("%c",b[i]);
	printf("\n");
	return 0;
	}

结果为:

2.字符指针作为函数参数

若想把一个字符串从一个函数传递到另一个函数,可以用地址传递的方法,即用字符数组名作为参数,也可一用字符指针变量作为参数。
下面分别以字符数组名和字符指针变量当实参和形参举例子,以供分析比较。
(1)用字符数组名作为函数参数
/*
将字符串a赋值为字符串b,然后输出字符串b。
*/

#include<stdio.h>

int main()
{
	void copy_string(char from[],char to[]);
	char a[]="I am a teacher";
	char b[]="You are a student";
	printf("string a =%s\nstring b=%s\n",a,b);
	
	printf("把字符串a复制到字符串b");
	copy_string(a,b);
	printf("string a =%s\nstring b=%s\n",a,b);
	return 0;
	
}
void copy_string(char from[],char to[]){
	int i = 0;
	while(from[i]!='\0')
	{
	to[i]= from[i]!='\0';
	i++;
	}
	t0[i]='\0';
}

(2)用字符型指针变量作为实参
/*
将字符串a赋值为字符串b,然后输出字符串b。
*/

#include<stdio.h>

int main()
{
	void copy_string(char from[],char to[]);
	char a[]="I am a teacher";
	char b[]="You are a student";
	char *from=a;char *to=b;
	printf("string a =%s\nstring b=%s\n",a,b);
	
	printf("把字符串a复制到字符串b");
	copy_string(from,to);
	printf("string a =%s\nstring b=%s\n",a,b);
	return 0;
	
}
void copy_string(char from[],char to[]){
	int i = 0;
	while(from[i]!='\0')
	{
	to[i]= from[i]!='\0';
	i++;
	}
	t0[i]='\0';
}


运算结果和上面的一样。
3.使用字符指针变量和字符数组的比较
使用字符指针变量和字符数组都能实现字符串的存储和运算,但是二者之间是有区别的,主要有一下几点:
(1)字符数组存放的是一个个的元素,而字符指针变量中存放的是地址,绝对不是将字符串复制到字符指针变量中。
(2)赋值方式不同,可以字符指针变量赋值,但是不可以对字符数组名赋值。
可以采用下面的方法对字符指针变量赋值:
char *a;
a="i love china";
不可用以下方法对字符数组名赋值
char str[14];
str[0]='i';
str="i love china";
(3)初始化的含义
对字符指针变量赋值:
char *a="i love china";
等价于:
char *a;
a="i love china";
而对数组的初始化:
char str[14]="i love china";
不等价于:
char str[14];
str[] = "i love china";// 企图把字符串赋值给数组中各个元素,错误。
数组可以在定义是对各个元素赋值,但是不可以用赋值语句对数组中的全部元素赋值。
(4)存储淡雅un的内容不同
编译时为字符数组分配存储单元,以便存放各个元素的值,而对于字符指针变量,只分配一个存储单元。
(5)指针变量的值是可以改变的,而数组名代表一个固定的值,不能改变。
(6)字符数组中各个元素的数值是可以改变的,,但是字符指针变量指向的字符串中的内容是不可以改变的。如:
char t[]="house";//字符数组a初始化
char *b="house";//字符指针变量指向字符串常量的第一个字符
t[2]='r';//合法,r取代a数组元素。
b[2]='r';//非法,字符串常量不能改变。

(7)引用数组元素
对字符数组可以用下标法引用一个数组元素,也可以用地址发引用数组元素。如果定义了字符指针变量p,并使他指向数组a的首元素,则可以使用指针变量带下边的方法引用数组元素。

指向函数的指针


1.什么是函数指针
如果在顶一个一个函数时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址称为这个韩式的指针。
一般形式为:
int (*p)(int,int);
定义了一个指向函数的指针变量,它可以指向的函数类型为整形,且有两个整形参数的函数。此时p的类型用int(*)(int,int)表示。
2.用函数指针变量调用函数
下面我们通过一个简单的列子展示:
/*
用函数球a,b中的大着。
*/

#include<stdio.h>

int main()
{
	int max(int,int);//函数声明
	int(*p)(int,int);//定义指向函数的指针变量p
	intr a,b,c;
	p=max;//使p指向max。
	printf("qingshurua和b");
	scanf("%d,%d",&a,&b);
	c= (*p)(a,b);//通过指针变量调用max函数。
	
	printf("a =%d\nb=%d\nmax=%d\n",a,b,c);
	return 0;
	
}
int max(int x,int y)
{
int z;
if(x>y)z=x;
else z=y;
}


运行结果为:

那么怎么判断一个指针变量是指向函数的指针变量呢?首先看变量名前有无*,有说明一定是指针变量,其次看变量名的后面是否有圆括号,如果有就是指向函数的指针变量。注意由于优先级的关系*指针变量名应该用括号括起来。另外一个需要万分注意的是在给函数指针变量赋值时,只需给出函数名,而不需要给出参数,如:
p=max;
但是如果写成:
p=max(a,b);就一定是错误的,这样写代表调用max函数,并把返回值传给p。

返回指针值的函数

1.一个函数可以返回整形值,字符值,实型值等,也可以返回指针类型的数据,即地址。
定义返回指针值的函数的一般形式为:
类型名 *函数名(参数列表)
如:int a*(int x,int y);下面通过小练习理解记忆:
/*
有a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数实现。

*/

#include <stdio.h>
int main()
{float score[ ][4]={{60,70,80,90},
         {56,89,67,88},{34,78,90,66}}; 
  float  *search(float (*pointer)[4],int n); 
  float  *p;  int i,k;
  scanf(“%d”,&k); 
  printf("The scores of No.%d are:\n",k);
  p=search(score,k); 
  for(i=0;i<4;i++)
      printf(“%5.2f\t”,*(p+i)); 
  printf("\n");
  return 0;
}
float *search(float (*pointer)[4],int n)
{ float *pt;
   pt=*(pointer+n);
   return(pt);
}

运行结果为:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值