C语言--指针

一、指针

1.指针声明格式

 1> 格式:变量类型 *变量名。举例:char *p,定义了一个指针变量p,只能存储地址

 * 记住*不是指针变量名,只是指针的一个标志

 2> 作用:指针就一个作用,存储地址,并且根据地址值访问对应的存储空间

 3> 例子

1 int main()
2 {
3     int a = 90;
4     int *p ;
5     p = &a; 
6     return 0;
7 }    
指针代码

 * 代码在内存中的表示

 * 注意点:① int *p只能指向int类型的数据 ②指针变量为经过初始化,不要拿来间接访问其    他存储空间 ③ 不允许这样写:*p = &a ,*p代表访问指针p所指向的存储空间 ④ 定义变量  是的*仅仅是一个象征,没有其他特殊含义

二、指向指针的指针

1.举例

  char a='A';

  char *p = &a; // 指向char类型存储空间的指针

  char **pp = &p; // 指向指针的指针

  char ***ppp = &pp; // 三级指针(不经常用)

 

2.指针应用

 1> 实现调用一个函数,得到多个返回值

 1 #include <stdio.h>
 2 
 3 int sumAndMinus(int num1, int num2, int *num3)
 4 {
 5     *num3 = num1 - num2;
 6     return num1 + num2;
 7 }
 8 
 9 
10 int main()
11 {
12     int a = 12;
13     int b = 8;
14     int minus;
15     int sum = sumAndMinus( a, b, &minus);
16     return 0;
17 }  
多返回值

3.指针占用内存

 * 指针占用内存与具体编译器有关,在Xcode中任何类型指针占用8个字节

三、指针与数组

1.数组的遍历

 //利用下标进行遍历

 int nums[3] = {1,2,3,}

 for(int i = 0;i < 3; i++)

  {

   printf("%d\n", nums[i]);

  }

2.利用指针对数组进行遍历

 int nums[3] = {1,2,3,};

 int *p = &nums ;

 //指针p指向数组的首元素地址;

 //(p+1)指向 nums[1];

 for(int i = 0;i < 3; i++)

  {

   printf("%d\n", *(p+i));

   printf("%d\n", p[i ]);

  }

四、指针与字符串、指针数组

1.字符数组与字符串的比较

 char c1[] = "name";

 //上面这行代码表示的是字符数组,所表示的是字符串变量

 char *c2 = "name";

 //上面这行代码。指针变量c2指向的是字符串首字母。它表所表示的是字符串常量

 //两行代码的不同,也与数据在内存中的存储有关

 char *c3 = "name";

 //注意:c2与c3所便是的是同一个地址

2.定义字符串的两种方式

 1> 利用数组

 char c[] = "name";

 //特点:字符串里面的字符是可以修改的

 //使用场合:字符串的内容需要经常修改

 2> 利用指针

 char *c = "name";

 //特点:字符串其实是一个常量字符串,里面的字符是不能修改的

 //使用场合:字符串的内容不需要修改,而且这个字符串经常使用

3.指针数组

 1> 指针数组的定义

 char *name[3] = {"jack", "rose", "tom"};

 2> 字符串的输入

 //新建一个字符数组,用来保存用户输入的字符串

 char name[20];

 // 数组名就表示数组首元素的地址

 scanf("%s", name);

五、指向函数的指针与返回指针的函数

 1.返回指针的函数

 char *test()

 {

  return  "name";

 }

 int main()

  {

   char *p = test();

   return 0;

  }

2.指向函数的指针

void test()

{

  printf("调用了test函数");

}

int main()

{

  //(*p)是固定写法,代表指针变量p将来肯定是指向函数

  //左边的void :指针变量P指向的函数没有返回值

  //右边的():指针变量p指向的函数没有形参

  void (*p)();

  //函数名就是函数地址

  p = test;

  //函数调用的三 种方式

  (*p)();// 第一种方式:直接调用

  test();// 第二种方式:利用指针调用

  p();//第三种方式:利用指针调用

  return 0;

}

 六、自我总结

好多同学说,指针很难,不容易理解,不过在我看来指针并没有什么,也只不过是一种数据类型,只不过指针存储的是地址,直接可以根据指针存储的地址对相应的内存空间进行操作。同时指针分很多类型,除去基本数据类型指针不说,还有指向函数的指针、指向指针的指针等等,有时读起来都挺拗口,但是这不阻碍我们的理解和使用,不要从心理上担心和害怕,任何类型的出现,都是为了方便我们,而不是给我们找麻烦。只要能从这个角度去理解,我相信拿下指针指日可待。

 

posted @ 2015-01-21 21:46  水木清华hm  阅读(275)  评论(0编辑  收藏  举报