IOS开发教程之C语言指针

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

b.指针所指向的类型必须和定义指针时声明的类型相同;上面指针q定义成了int型而指向了char型,结果输出*q打印出了2049,具体原因见下图(假设在16位编译器下,指针长度为2字节)

IOS开发教程之C语言指针

由于局部变量是存储在栈里面的,所以先存储b再存储a、p,当打印*p的时候,其实就是以p指向的地址对应的空间开始取两个字节的数据(因为定义p的时候它指向的是int型,在16位编译器下int类型的长度为2),刚好定义的b和c空间连续,所以就取到b的其中一个字节,最后*p二进制存储为“0000100000000001”(见上图黄色背景内容),十进制表示就是2049;

c.指针变量占用的空间和它所指向的变量类型无关,只跟编译器位数有关(准确的说只跟寻址方式有关);

数组和指针

由于数组的存储是连续的,数组名就是数组的地址,这样一来数组和指针就有着很微妙的关系,先看以下例子:


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

#include <stdio.h>

void changeValue(int a[]){
  a[0]=2;
}
void changeValue2(int *p){
  p[0]=3;
}

int main(int argc, const char * argv[]) {
  int a[]={1,2,3};
  int *p=&a[0]; //等价于:*p=a;
  
  printf("len=%lun",sizeof(int));//取得int长度为2
  
  //指针加1代表地址向后挪动所指向类型的长度位(这里类型是int,长度为2)
  //也就是说p指向a[0],p+1指向a[1],以此类推,所以我们通过指针也可以取出数组元素
  for(int i=0;i<3;++i){
    //printf("a[%d]=%dn",i,a[i]);
    printf("a[%d]=%dn",i,*(p+i));//由于a就代表数组的地址,其实这里还可以写成*(a+i),但是注意这里*(p+i)可以写成*(p++),但是*(a+i)不能写成*(a++),因为数组名是常量
  }
  /*输出结果:
   a[0]=1
   a[1]=2
   a[2]=3
   */
   
  
  changeValue(p); //等价于:changeValue(a)
  for(int i=0;i<3;++i){
    printf("a[%d]=%dn",i,a[i]);
  }
  /*输出结果:
   a[0]=2
   a[1]=2
   a[2]=3
   */
  
  changeValue2(a); //等价于:changeValue2(p)
  for(int i=0;i<3;++i){
    printf("a[%d]=%dn",i,a[i]);
  }
  /*输出结果:
   a[0]=3
   a[1]=2
   a[2]=3
   */
  
  return 0;
}

从上面的例子我们可以得出如下结论: