Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36133
  • 博文数量: 16
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-16 19:30
个人简介

嵌入式Linux编程 Android软件开发

文章分类

全部博文(16)

文章存档

2015年(16)

分类: C/C++

2015-04-30 13:14:27

一 C语言指针变量(草根派)

 

1.C语言分配内存 

 

<1>定义变量 

<2>malloc函数

 

2.C语言对内存操作 

 

<1>内存标识符号(变量名)

<2>内存所在的地址

 

读内存:变量名 ,  *地址值

写内存:变量名=,*地址值 

 

3.C语言的两种变量 

 

<1>普通变量 保存数值

 

定义:

数据类型  变量名;

int       a;

 

<2>指针变量 保存地址值 

 

定义:

数据类型 *变量名;

 

int      *p;

 

练习:已知data1 = 200,data2 = 300,要求:通过两个指针变量实现data1data2的数据交换(之少两种交换方法)?

 

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int *p;
  5.     int *q;
  6.     int *t;
  7.     int data1 = 200;
  8.     int data2 = 300;


  9.     p = &data1;
  10.     q = &data2;

  11.     t = p;
  12.     p = q;
  13.     q = t;

  14.     printf("data1 = %d,data2 = %d\n",data1,data2);

  15.     return 0;
  16. }


====================================================================

总结:

通过指针变量,读写一块内存

<1>用指针变量保存对应内存的地址值

<2>读内存: *指针变量(读指针变量保存地址的内容)  , 

   写内存: *指针变量=(将值写到指针变量保存的地址

=====================================================================

 

练习:定义10个元素的整型数组,然后给数组输入值,用p_max 和 p_min保存最大值和最小值所在的地址,

    然后通过p_max 和 p_min 输出最大值和最小值,

最后通过p_max 和 p_min 实现最大值和最小值的交换,然后输出数组的内容 

 

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i;
  5.     int a[10];
  6.     int temp;
  7.     int *p_max;
  8.     int *p_min;

  9.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
  10.     {
  11.         scanf("%d",&a[i]);
  12.     }

  13.     p_max = &a[0];//p_max = a;
  14.     p_min = &a[0];//p_min = a;
  15.     
  16.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
  17.     {
  18.         if(*p_max < a[i])
  19.         {
  20.             p_max = &a[i];
  21.         }

  22.         if(*p_min > a[i])
  23.         {
  24.             p_min = &a[i];
  25.         }
  26.     }

  27.     printf("max : %d, min : %d\n",*p_max,*p_min);
  28.     
  29.     temp = *p_max;
  30.     *p_max = *p_min;
  31.     *p_min = temp;


  32.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
  33.     {
  34.         printf("%d ",a[i]);
  35.     }
  36.     printf("\n");

  37.     return 0;
  38. }


 

二 C语言指针变量的数据类型(草根派)

 

1. C语言指针变量的数据类型决定指针变量的寻址范围(通过不同数据类型的指针变量对一块内存操作的时候,

一次性读和一次性写的字节数将不一样)

 

int   *p1; //每次操作四个字节

short *p2; //每次操作2个字节

char  *p3; //每次操作1个字节 

 

2.不同数据类型的指针变量,在加和 减1的时候,增加的地址不一样

 

int *p1;

short *p2;

char *p3;

 

p1 = &data;

p2 = &data;

p3 = &data;

 

p1 ++; //p1= &data  + 4

p2 ++; //p2 = &data + 2

p3 ++; //p3 = &data + 1

 

总结:指针变量在移动的时候,每次移动的单位是指针变量数据类型的大小

 

注意:以上的说法只使用于一级指针变量(多级指针变量比较特殊)

 

练习:

short a[] = {1,2,3,4,5,6,7,8,9};要求通过两个指针变量,实现数组逆置,最后输出数组的内容

提示:

p保存第一个元素的地址,q保存最后一个元素的地址,然后交换pq保存地址的内容,接着让p向后

走动一步,q指针向前走动一步

 

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i = 0;
  5.     short temp;
  6.     short *p,*q;
  7.     short a[] = {1,2,3,4,5,6,7,8,9};

  8.     p = &a[0];
  9.     q = &a[sizeof(a)/sizeof(a[0]) - 1];
  10.     
  11.     while(p < q)
  12.     {
  13.         temp = *p;
  14.         *p = *q;
  15.         *q = temp;
  16.         p ++;
  17.         q --;
  18.     }

  19.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
  20.     {
  21.         printf("%d ",*(p + i));
  22.     }
  23.     printf("\n");

  24.     return 0;
  25. }


三 多级指针变量(草根派)

 

C语言指针变量设计规则:

(1)一级指针变量保存普通变量地址 

(2)二级指针变量保存一级指针变量地址 

(3)三级指针变量保存二级指针变量地址 

 

例如:

int *p;//一级 

int **q;//二级指针变量 

int ***m;//三级指针变量 

 

总结:多级(>=2)指针变量每次移动的单位是一个地址的大小 

 

四 指针数组(草根派)

 

本质:是一个数组,这个数组用来存放多个地址值,定义一个指针数组的时候,等价于定义多个指针变量 

 

1.定义指针数组 

 

数据类型  *数组名[数组元素的个数];

 

int  *p[3]; => p[0] p[1] p[2] 就是三个int 型的指针变量 

 

问题:如何保存指针数组的首地址?

|    | p[0]

|    | p[1]

|    | p[2]

 

获得数组的首地址:数组名p , 数组第一个元素的地址&p[0]

 

int **q;

 

q = p;或 q = &p[0];

 

练习:

char a1[] = "abcdef";

char a2[] = "ABCDEF";

char a3[] = "123456";

char buf[1024];

char *p_arry[] = {a1,a2,a3,NULL};

 

<1>通过一个指针变量,操作指针数组,输出a1,a2,a3数组中的字符串

 

<2>通过指针数组,将a1,a2,a3连接在一起,存放在数组buf,

然后输出buf的内容(buf中最后存放的是一个字符串);

 

<3>buf数组中的字符串,以从小到大的方式排列,然后输出 

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int j;
  5.     int n;
  6.     char temp;
  7.     char *p;
  8.     char **q;
  9.     int count = 0;
  10.     int i = 0;
  11.     char buf[1024];
  12.     char a1[] = "abcdef";
  13.     char a2[] = "ABCDEF";
  14.     char a3[] = "123456";
  15.     char *p_arry[] = {a1,a2,a3,NULL};//0

  16.     for(q = p_arry; *q != NULL;q ++)
  17.     {
  18.         printf("%s\n",*q);
  19.     }
  20.     
  21.     for(i = 0;p_arry[i] != NULL;i ++)
  22.     {
  23.         for(p = p_arry[i]; *p != '\0'; p ++)
  24.         {
  25.             buf[count ++] = *p;
  26.         }
  27.     }

  28.     buf[count] = '\0';
  29.    // 0123
  30.     //ABC\0

  31.     printf("buf : %s\n",buf);
  32.     
  33.     n = count;

  34.     for(i = 0;i < n - 1;i ++)
  35.     {
  36.         for(j = 0;j < n - i - 1;j ++)
  37.         {
  38.             if(buf[j] > buf[j + 1])
  39.             {
  40.                 temp = buf[j];
  41.                 buf[j] = buf[j+1];
  42.                 buf[j+1] = temp;
  43.             }
  44.         }
  45.     }

  46.     printf("buf : %s\n",buf);
  47.     
  48.     return 0;
  49. }


阅读(1069) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~