从零开始一起学C语言(五)---指针

目录

一、指针和地址

1、地址

2、指针

二、指针的使用

1、定义

2、初始化

3、指针的引用

4、空指针

5、野指针

三、指针的大小

四、指针和数组

五、指针和函数

1、指针函数

2、函数指针

六、函数的参数传递

1、值传递:传递的参数为普通变量,改变形参的值,实参的值不会改变。

2、址传递:传递的参数为一个地址,子函数可以通过该地址访问到实参。

七、指针和字符串

八、多级指针


一、指针和地址

1、地址

现实生活中的地址:郑州市、二七区、民主路6号。人为规定的地址。

c语言中的地址:给一块物理内存或则虚拟内存进行地址的编号,以字节为单位,按顺序进行编号。

2、指针

一个存放地址的变量。通常称为指针变量。

二、指针的使用

1、定义

类型说明符 *指针名;

*说明这是一个指针变量。

类型说明符:指针指向内存单元存储的数据类型。

例:int *p;//定义一个指针变量,该指针能指向一个存储整形数据的内存单元。

char *p;//定义一个指针变量,可以指向一个存储字符类型数据的存储单元。

2、初始化

int num;

int *p = #//用一个地址来初始化指针。

3、指针的引用

int num = 10;     

int *p;

p = #// & 取地址运算符

*p = 5;   //num = 5;  // * 指针运算符,用来访问指针指向的内存单元。

4、空指针

       没有指向任何对象或则函数的指针(不能理解为未初始化的指针),通常理解为指向0内存单元。c语言中规定用宏定义NULL来表示空指针。

例:int *p = NULL;//int *p = 0;

5、野指针

       指向未知内存单元的指针。例:未初始化的指针,看似没有指向,其实指向一个未知的内存单元,有可能存储的是系统代码,对其内容修改有可能使系统崩溃。所以要避免出现野指针。

三、指针的大小

32位的cpu有32位地址总线,对应指针的大小为4个字节。

注意:大小和指向的内容无关。

四、指针和数组

数组:内部的元素在内存中是连续排列的,数组名表示数组的首地址。

使指针指向数组的两种方式:

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

int *p = num;//数组名表示数组的首地址

int *p = &num[0];//数组第一个元素的地址

指针指向数组的时候,指针++对应的是元素类型大小的变化。

指针数组:就是一个数组,里面的元素全部是指针。

一般批量处理字符串时使用。

char *p[3]={“fjaljf”,”gafaf”,”agggs”};

五、指针和函数

1、指针函数

就是一个函数,返回值为指针。

注意:返回的指针要有意义,即指针指向的内容不能被释放。

一般返回的是静态变量指针或则字符串指针。

#include <stdio.h>

char *fun();

int main()

{

         char *p;

         p = fun();

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

         return 0;

}

char *fun()

{

         char str[] = "jfjlaj";

         static char str1[] = "jglaj";

         char *p = "jfjlaj";

         //return str; //错误

         //return str1;//正确

         return p;   //正确

}

2、函数指针

就是一个指针,指向一个函数。可以通过指针来访问该函数。

定义: 类型说明符 (*指针名)(参数类型);

例:int fun(int a); 函数指针为:int (*p)(int);//

#include <stdio.h>

int fun(int a);

int main()

{

       int (*p)(int);

       p = fun;

       p(30);//fun(30);

       return 0;

}

int fun(int a)

{

       printf("%d\n",a);

       return 0;

}

g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数 

Int (*a)(int)

h)一个有 10 个指针的数组,该数组的每一个元素都是指针,并指向一个函数,该函数有一个整型参数并返回一个整型数Int (*a[10])(int)

六、函数的参数传递

c语言中参数的传递分为值传递和址传递。

1、值传递:传递的参数为普通变量,改变形参的值,实参的值不会改变。

#include <stdio.h>

int fun(int a);

int main()

{

         int b = 12;

         fun(b);

         printf("%d\n",b);  //b = 12;

         return 0;

}

int fun(int a)

{

         a = 10;

         return 0;

}

2、址传递:传递的参数为一个地址,子函数可以通过该地址访问到实参。

#include <stdio.h>

int fun(int *p);

int main()

{

         int b = 12;

         fun(&b);

         printf("%d\n",b);// b =10;

         return 0;

}

int fun(int *p)

{

         *p = 10;

         return 0;

}

七、指针和字符串

c语言中允许用一个字符串来初始化一个指针。该指针指向字符串的首地址。

例:char *p = “jljhjljga”;

       char str[] = “gjlag”;

        p = str ;

注意:不能通过该指针改变字符串的值,因为字符串为常量,只读不可改变。但是指针的指向是可以改变的。

八、多级指针

指针的指针

定义: 类型说明符 **指针名;

int num = 5;

int *p = &num;

int **pp = &p;

猜你喜欢

转载自blog.csdn.net/qq_38639426/article/details/88576215