黑马程序员———C基础语法(三)---复杂数据类型(指针)

来源:互联网 发布:远程协助的软件 编辑:程序博客网 时间:2024/05/01 11:21

      ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一、指针

指针是c语言中非常重要的数据类型,如果你说c语言中除了指针,其他你都学的很好,那你干脆说你没学过c语言。

     1.指针变量的定义

       定义的格式:  变量类型 *变量名;

           (1)先定义后赋值

                int *p; // 定义指针变量

                int a = 9;

                p = &a; // 指针变量p指向了变量a

                *p = 10; //访问p指向的地址空间

                printf("%d\n",a); // 结果为 10

           (2)定义的同时赋值

                int a = 10;

                int *p = &a; 

       2.指针变量的作用:

         指针变量只能存储地址,其实指针就一个作用,能够根据一个地址值,访问对应的存储空间。

二、指向指针的指针

     如下所示:

     int a = 10;

     int *p = &a;

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

     ***pp = **pp = *p = a; //无论用哪种方式都能改变a的值

三、指针与数组

     1.指针指向数组:

       int ages[5] = {10,9,8,7,6};

       int *p;

       p = &ages[0]; 

       或:p = ages;

       解释:数组名就是数组的地址,也是数组首元素的地址。

     2.数组元素的访问方式

       (1)数组名[下标]  --->ages[1]

       (2)指针变量名[下标] ---->p[1]

       (3)*(p+i)

        解释(3):指针变量的 +1 是多少字节,取决于指针的类型。

四、指针与字符串

     字符串的定义方式:

     (1)数组字符串:

           char s[] = "haha";

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

       (2)指针指向字符串

            char *s = "haha";

            或:

            char *s;

            s = "haha"; 

            特点:这里的字符串是常量字符串,里面的字符是不可以修改的;

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

五、返回指针的函数(只要看懂)

     指针也是c语言的一种数据类型,因此一个函数的返回值肯定可以是指针类型的

     返回指针的函数的一般形式:类型名 *函数名(参数列表);

六、指向函数的指针(只要看懂)

     定义格式: 函数的返回值类型(*指针变量名)(形参1,形参2,....);

          (*z指针变量名) :是固定写法,代表指针变量p 将来肯定指向的是函数。

     为什么指针可以指向一个函数:

          函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。

      注意:函数名就代表着函数的地址。

      使用注意:由于这类指针变量存储的是一个函数的入口地址,所以对它们进行加减操作是无意义的。

      指向函数的指针主要有两个用途:

          1.调用函数;

          2.将函数作为参数在函数间传递。

七、小练习

     指针练习:

/*

    输入两个数

    打印两个数的和、差、积、商、以及余数

  */

#include <stdio.h>

 //声明jisuan函数

 double jisuan(double a,double b, *n, *n2, *n3, *n4);

int main()

{

  //定义个变量,保存用户输入的数

  double num1, num2sum,minus,multiply,devide,yushu;

  //提示用户输入两个数

  printf("请输入两个数:");

  

  //接收用户输入的两个数

  scanf("%f,%f"&num1,&num2);

  //调用jisuan函数

  double sum = jisuan(num1,num2,,&minus,&multiply,&devide,&yushu);

  //打印两个数的和、差、积、商、余数

  printf("sum=%f,minus=%f,multiply=%f,divide=%f,yushu=%f",sum,minus,multuply,divide,yushu);

 return 0;

}

double jisuan(double a,double b, *n, *n2, *n3, *n4)

//计算两个数的差

*n = a - b;

//计算两个数的积

*n2 = a * b;

//计算两个数的商

*n3  = a / b;

//计算两个数的余数

*n4 = a % b;

//返回两个数的和

return a + b;

   

}

输入两个数:10 , 5

运行结果:sum=15minus=5multiply=50divide=2yushu=0

指针与数组:

   

    /*

有一个数组int a[nSize],要求写一个函数:

int *myfunc(int *p,int nSize);

a中的都移到数组末尾,将非的移至开始(保持原来的顺序不变)

*/

#include <stdio.h>

//函数的声明

int *myfunc(int *p,int nSize);

int main()

{

//定义一个一维数组

int a[5] = {0,3,0,2,1};

int b[5] = myfunc(a[5],5);

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

{

printf("%d ",b[i]);

}

    

return 0;

}

//定义函数

int *myfunc(int *p,int nSize)

{

int j = nSize - 1;

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

{

int temp;

if(*(p+i) == 0)

{

temp = *(p+i);

for(int k = i;k < j;k++)

{

*(p+k) = *(p+k+1);

}

*(p+j) = temp;

j--;

}

}

return p;

}

     运行结果:3 2 1 0 0

  指针与字符串:

      

    #include <stdio.h>

int main()

{

//指针变量name指向了字符串的首字符

char *name = "rose";

    

//name name2 指的是同一个内存空间

char *name2 = "rose"

//打印的首字符

printf("%c\n",*name);

//打印的字符串,%s会从某个地址开始一个一个输出字符,直到遇到'\0'为止

printf("%s\n",name2);

return 0;

}

运行结果为:r         

            rose



0 0
原创粉丝点击