您的位置:首页 > 编程语言 > C语言/C++

【课堂笔记】C语言基础与提高3

2018-01-31 20:05 323 查看
指针

 

1、定义与作用

指针是变量的一种,里面是地址,通过地址找到要找的数据。

单元的地址就是指针的内容;

 

2、指针运算符

       &是取地址的运算符,*是表示指针运算符

例: int *p1, a;

        p1= &a;

        *p1 = 3;

&:取地址;

*:1.定义时表示的是指针变量。2.使用时表示取值。

 

例:利用指针运算实现strcpy

#include <stdio.h>

#include <stdlib.h>

 

char *mystrcpy(char *dest, char *src)        \\dest为目的,src为源

{

       char*tmp = dest;

 

       if(dest == NULL || src == NULL)

       {

              returnNULL;

}

while ((*dest++= *src++) != ‘\0’);     \\表达式为0时退出循环

return tmp;

}

 

int main()

{

       char*str;

       char*ptr;

 

       str= (char *)malloc(sizeof(char) * 20);       \\在堆中申请,需要释放内存

       ptr= (char *)malloc(sizeof(char) * 20);      \\为指针变量申请内存空间

 

       printf(“Pleaseinput:\n”);

       scanf(“%s%s”,str, ptr);

      

       mystrcoy(str,ptr);

 

       printf(“%s\n”,str);

}

 

3、指针作函数参数

       函数的参数是一个指针,作用是将变量的地址传送到另一个函数中。

       char* a(int *, int *)

 

区分:

函数指针:即指向这个函数的指针,定义为“数据类型 (*func)(参数列表);”()的优先级比*高,所以*func加括号,如”void (*func)(int *, int *);”

指针函数:即返回值是指针的函数,定义为”数据类型 *func(参数列表);”,如“char*func(int *, int *);“,即返回值为char *型。

 

 

指针与变量

 

注意:指针变量未赋值时,可以是任意值,是不能使用的,会造成意外错误。而指针变量给NULL值后,则是可以使用的,只是不指向具体的变量。

 

指针变量的使用步骤

1、 定义指针变量;    char * p;

2、 给指针变量赋地址;    p = (char *)malloc(sizeof(char)* 20);

3、 正常使用指针进行运算;

 

 

指针和数组

 

指针数组:每个元素都是指针

数组指针:指向数组地址的指针

 

数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。

 

int a[10];        //定义a为包含10个整型数据的数组

int *p;            //定义p为指向整型变量的指针

p = &a[0];     //把a[0]元素的地址赋给指针变量p。也就是说,p指向a数组的第0号元素。

 

指向数组的指针变量也可以带下标。p[i]和*(p + i)等价

 

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

 

int *p1 = (int*)(&a + 1);       \\&a数组的地址,&a+1表示下一个数组,无意义

int *p2 = (int*)((int)a + 1);    \\

int *p3 = (int*)(a + 1);  \\a数组首元素的地址,a+1表示第二个元素。

 

数组和字符串

用字符串指针指向一个字符串

main()

{

       char*string[] = {“I love China!”, “I am”};

       printf(“%s\n”,string);

}

 

char *s = “C Language”; 则表示s是一个指向字符串的指针变量,”C Language”为常量,不可修改。把字符串的首地址赋予s

 

字符数组和字符串的区别

1、 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以’\0’作为串的结束。

字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。

2、 对字符串指针方式 char *ps = “C Language”;

可以写为:char *ps; ps = “C Language”;

而对数组方式:char st[] = {“C Language”};

不能写为:

char st[20];     st ={“C Language”};

而只能对字符数组的各元素逐个赋值。

 

 

指针与函数

 

int (*pf)();       //函数的返回值是整型

typedef unsigned char uchar;     //声明一个新的数据类型

 

1、int *(*(*fp)(int))[10];

2、int*(*(*array[5]))())();

 

1:fp是一个指针,指向一个函数,函数有一个int类型的形参,函数的返回值是一个指针,指向一个有10个元素的数组,每个元素的类型都是int *

2:array是一个数组,有5个元素,每个元素的类型是一个指针,指针指向一个不带参数的函数,返回值是一个指针,指针指向一个函数,函数的类型是int *。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: