IOS开发教程之C语言指针

2020-01-12 14:04:21于丽

数组名a==&a[0]==*p; 如果p指向一个数组,那么p+1指向数组的下一个元素,同时注意p+1移动的长度并不固定,具体需要根据p指向的数据类型而定; 指针可以写成p++形式,但是数组名不可以,因为数组名是常量 不管函数的形参为数组还是指针,实参都可以使用数组名或指针;扩展--字符串和指针

由于在C语言中字符串就是字符数组,下面不妨看一下字符串和数组的关系:


//
// main.c
// Point
//
// Created by Kenshin on 14-7-05.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
  char a[]="Kenshin";
  printf("%x,%sn",a,a);//结果:5fbff820,Kenshin,同一个变量a是输出字符串还是输出地址,根据格式参数而定
  printf(a); //结果:Kenshin
  printf("n");
  
  char b[]="Kenshin";
  char *p=b;
  printf("b=%s,p=%sn",b,p);//结果:b=Kenshin,p=Kenshin
  
  //指针存储的是地址,而数组名存储的也是地址,既然字符数组可以表示字符串,那么指向字符的指针同样也可以,如下方式可以更简单的定义一个字符串
  char *c="Kenshin"; //等价于char c[]="Kenshin";
  printf("c=%sn",c); //结果:c=Kenshin
  
  return 0;
}

以上代码中注释基本已经很清楚了,这里需要指出是为什么printf(a)能够直接输出字符串呢?

我们看一下printf()的定义:int printf(const char * __restrict, ...) __printflike(1, 2);

其实printf的参数要求是指向字符类型的指针,而结合上面的例子和我们之前说的,如果函数形参是指针类型那么可以传入函数名,因此也就能正确输出字符串的内容了。类似的还有上一篇文章中说的strcat()、strcpy()等函数均是如此。

函数指针

在弄清函数指针的问题之前,我们不妨先来看一下返回指针类型数据的函数,毕竟指针类型也是C语言的数据类型,下面以一个字符串转换为大写字符的程序为例,在这个例子中不仅可以看到返回值为指针类型的函数同时还可以看到前面说到的指针移动操作:


//
// main.c
// Point
//
// Created by Kenshin Cui on 14-06-28.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>

char * toUpper(char *a){
  char *b=a; //保留最初地址,因为后面的循环会改变字符串最初地址
  int len='a'-'A'; //大小写ASCII码差值相等
  while (*a!='') { //字符是否结束
    if(*a>'a'&&*a<'z'){//如果是小写字符
      *(a++) -= len; //*a表示数组对应的字符(-32变为小写),a++代表移动到下一个字符
    }
  }
    return b;
}

int main(int argc, const char * argv[]) {
  char a[]="hello";
  char *p=toUpper(a);
  printf("%sn",p); //结果:HELLO
  return 0;
}