C语言基础——指针2



1.通过指针引用字符串

字符串的引用方式

        在C语言中,字符串是存放在字符数组中的,想引用一个字符串,可以使用以下两种方法。

1. 用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明”%s”输出该字符串。

例如,定义一个字符数组,在其中存放字符串“I love China !”,输出该字符串和第8个字母

#include <stdio.h>
int main ()
  {
   char string []=”I love China !”; 
   printf(“%s”,string);
   printf(“%s\n”,string [7]);
   return 0 ;
}

2. 用字符指针变量指向一个字符串常量,通过字符指针引用字符串常量。

例如,

#include <stdio.h>
Int main ()
  {
   char *string []=”I love China !”; 
   printf(“%s”,string);
   return 0 ;
}

 

注意:通过字符数组名或字符指针变量可以输出一个字符串,但对一个数值型数组,是不能企图用数组名输出它的全部元素的。



2. 字符指针作函数参数

        如果想把一个字符串从一个函数传递到另一个函数,可以用地址传递的方法,即用字符数组名作参数,也可以用字符指针变量做参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。

例如,用函数调用实现字符串的复制

#include <stdio.h>  
int main()  
{  
  void copy_string(char from[],char to[]);  
  char a[]="I am a student.";  
  char b[]="You are a teacher.";  
  char *from,*to;  
  printf("String a is %s\nString b is %s\n",a,b);  
  printf("Now copy a to b...\n");  
  copy_string(from,to);  
  printf("String a is %s\nString b is %s\n",a,b);  
  return 0;  
}  
void copy_string(char from[],char to[])  
{  
  int i=0;  
  while(from[i]!='\0') 
  {  
    to[i]=from[i];i++; 
  }  
  to[i]='\0';  
}  


使用字符指针变量和字符数组的比较

1、字符数组由若干元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,绝不是将字符串放到字符指针变量中。

2、赋值方式:可以对字符指针变量赋值,但不能对数组名赋值。

3、初始化的含义。对字符指针变量赋初值:

char*a="abc";  //定义字符指针,并把字符串的首地址赋给a。

charb[]="abc";  //定义字符数组,并把字符串赋给数组中各元素。

4、存储单元的内容。编译时:为字符数组分配若干存储单元,以存放各元素的值。而对字符指针变量,只分配一个存储单元。

5、指针变量的值可以改变,而数组名代表一个固定的值,不能改变。

例如,改变指针变量的值

#include <stdio.h>
Int main ()
{
char *a =”abc”;
a=a+7;
printf(“%s\n”,a);
return 0 ; 
}

6、字符数组中各个元素的值可改变,但字符指针变量指向的字符串常量中的内容是不可被取代的。

7、char *format="a=%d,b=%d\n";printf(format,a,b);字符指针变量允许存放一句printf函数中的表达式。


3. 指向函数的指针

 

什么是函数指针

        如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址成为这个函数的指针。可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如:

int (*p) (int ,int );

用函数指针变量调用函数,例如

#include <stdio.h>  
int main()  
{  
  int max(int,int);  //函数声明  
  int (*p)(int,int);  //定义函数指针变量  
  int a,b,c;  
  p=max;        //指针指向max入口地址  
  c=(*p)(a,b);     //通过指针变量调用max函数 
  printf(“max is %d”, c);
return 0;  
}  

int max(int x,int y)  //定义max函数
{
return x>y?x:y ; 
}

怎样定义和使用指向函数的中指针变量

        定义指向函数的指针变量的一般形式:

        类型名 (*指针变量名)(函数参数列表);

注意:函数指针不能进行算术运算!p+1,p-n是无意义的。

 

 4.有关指针的小结

1、指针就是地址,但指针&指针变量不同。

2、指向意味着通过对象的地址。

3、一维数组名arr代表首元素地址,*p=arr;数组给指针p赋值首元素地址。

4、关于指针的归纳比较:

变量定义     类型表示     含义

int I               int                  定义整型变量i

int *p            int *               定义p为指向整型数据的指针变量

int a[5]         int [5]             定义有5个元素的整型数组

int *p[4]        int*[4]           定义指针数组,由4个指向整型数据的指针元素组成

int (*p)[4]      int(*)[4]         p为指向包含4个元素的一维数组的指针变量

int fun()         int ()             返回int函数值的函数fun

int *p()          int*()             p为返回一个(指向整型数据的)指针的函数

int (*p)()        int (*)()         p为指向(返回整型数据的)函数的指针

int **p            int **             p是一个指向整型数据的指针变量的指针变量

void *p          void *           p是一个指针变量,基类型为void,即p是一个不指向具体对象的指针变量

5、指针运算,明白以下含义:p++、p--、p+i、p-i、p=&a、p=arr、p=&arr[i]、p=fun、p1=p2。

6、指针变量可以有空值,p=NULL(在stdio.h头文件中#define NULL 0),它使p指向地址为0的单元。

注意:指针使用实在太灵活,对熟练的程序员可以编出高质、高效的代码,但对初学者要慎用,比如:未对p赋值的情况下,就向*p赋值会破坏其它单元内容。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值