学习笔记5-C语言指针

来源:互联网 发布:日本烘焙大师 知乎 编辑:程序博客网 时间:2024/05/22 03:03

一 指针

1  内存地址的概念

内存地址:内存中存储单元的编号.

变量地址:系统分配给内存单元的起始地址。

2 指针的概念

         指向内存单元的地址。

3  指针的好处

1) 让函数有多个返回值。

2) 为函数提供修改和调用变量的灵活手段。

3) 可以改变某些子程序的效率。

4) 为动态数据结构(二叉树,链表)提供支持

4  变量的存取方式

a直接存取:通过变量名称赋值和取值

b间接存取:通过指针对变量赋值和取值。

5  指针变量概念

      存储指针的变量

        变量的值是一个地址。

6  指针变量定义和初始化

       类型说明符 * 变量名;

        charch=‘a’;

        char*p = &ch;

 

注意

        a 类型说明符是指针变量指向的变量的数据类型。

         b *说明定义的变量是一个指针变量。

       c指针变量有全局 和局部之分

d 不初始化的指针变量存储的值为随机数,这种指针称为野指针。

f 不知道指向的指针变量最好赋值为 null。

g 定义什么类型的指针就应该指向什么类型的变量

7 指针变量的引用

              *p 取p地址存储的值。

8 指针应用场景

1) 在被调函数中修改主调函数的变量值。

2) 在函数中实现返回多个返回值,在传参数的时候将将要返回值的地址传入被调函数中。修改地址对应的值就可以实现多个返回值。

9 二级指针

            指向指针的指针

10 数组指针

     指向数组的指针

1)指针与一维数组

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

           int *p =a;

           a为数组名 存储的是数组的首地址。

           p+1:指向数组中下一个数据的地址

           *p++  指针偏移  先取p值 再加 *p++ 的值为*p的值

2)指针与二维数 组

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

a 是数组首地址 也是第0行的首地址,也是第0行第0列的地址

       a[0]+i 是第0行第i列的地址。

a+i表示第i行首地址

 

*(a+i)为第i行的首地址。

**(a+i) 为第i行第0列的值。

*(*(a+i)+j)为第i行j列的值。

 

11 一维指针数组

    存储指针的数组。

                 

           int a=b=b=3;

           int *p[3]={&a,&b,&c};

    p为数组的首地址,也是第一个元素的存储地址。

    使用数组名访问a的值

    *p 为第一个元素的值也为a的地址

**p 为a的值。

 

12  二维数组指针

C 语言中可以通过定义行数组指针的方法,使得指针变量与二维数组名有相同的性质。

       数据类型 (*指针变量名)[二维数组的列数];

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

       int (*p)[2]=a; 定义一个数组指针,指向含2个元素的一维数组。

二维数组中  a=&a[0]=&a[0][0]=a[0]

*(*(p+i)+j)获取二维数组的每个值。

 

指针数组和二维数组指针的区别

指针数组  int *p[2]     ;多个指针

二维数组指针 int (*p)[2]; 一个指针变量

13  字符串指针

       字符串定义  char str[10]=“abcdef”;

       字符串指针定义 char *str;

str = “dasda“;取字符串的首地址赋值给str

       str都为字符串的首地址。

 

14 char型指针数组

char 类型指针数组

1)定义

 char *name[3]={

              “xiaoming”,   //值都是字符串的首地址

              “xiaohong”,

“xiaohuang”

}

           2)使用

                     指针法printf(”%s\n”,*(name + i));

   下标法 printf(”%s\n”,name[i]);  name[i]为指针数组的第i个元素的值,也为字符串的首地址。

 

3)字符串指针和字符数组的区别

              字符串指针:char  *str=“abc “;

                        abc保存在常量区 str为指针变量可以重新赋值(指向)

字符数组 :char   str[]=“abc “;

              abc保存在栈区 str为常量值为abc的首地址不能重新赋值。

15 fgets函数的使用

   暂时使用fgets接收从键盘接收一个字符串,保存到数组中。

       scanf不可以接收空格。

       gets可以接收空格,越界访问警告

       fgets 安全的字符串接收函数。保留一个位置存\0.

使用格式

  fgets(字符数组名,长度 ,stdin);

int ch[10];

fgets(ch,sizeof(ch),stdin);     


16  fputs函数的使用

 

fputs(地址,stdout);  //不会自动换行 puts可以自动换行。都不能格式化输出

 

       17 const关键字

       const是类型修饰符。

       修饰的变量值不能改变。静态常量。

 

0 0