美文网首页
C语言指针收藏

C语言指针收藏

作者: 编程小世界 | 来源:发表于2019-06-17 20:43 被阅读0次

指针是什么

》》每一个内存单元只能同时存储一个数据,如何保证内存单元同时只能存储一个数据,可以使用编号的方式实现内存单元标记,此编号就是指针。

》》指针是一个变量,指针是存放着一个数据的内存地址而不是数据本身的值,其是查找数据的另一种方式

相关运算符

【&】在变量中取地址

【*】在地址中取变量

测试小程序:

#include<stdio.h>voidmain(){inti =10;//定义一个变量,并赋初始值为10int*p = &i;//定义一个指针变量,并赋初始值为i的地址*p =199;printf("%d=%d", *p,i);//输出199=199printf("---%d---", p);//得到变量i的地址}

指针变量的类型

》》指针类型:int *、float*、long*、double*、char*等等

》》指针变量的类型需要与存储的数据类型相同

》》确定类型可以方便指针变量确定存储数据的大小,为数据寻找到结束符,如int类型占四个字节、char占一个字节。也方便指针使用加1或减1操作,如int加减1会跳动4个字节,char加减1会跳动两个字节。

指针的赋值

int i=10;  int *p=&i;

int *pp;

pp=p;

指针运算符:

*p++

等同于p++;*p;或者*(p++),运算优先级为从右到左。

指针变量作为函数参数

#include<stdio.h>//int *a1=&b1;voidfun(int*a1,int* a2){        *a1 =100;intii =99;    a2 = ⅈ//让指针重新指向另外一个地址printf("得到的数据:%d,%d", *a1, *a2);//输出100,99}voidmain(){intb1 =1, b2 =2;    fun(&b1, &b2);printf("调用函数后:%d,%d", b1, b2);//输出100,2}

输出b2的结果并不是相同的值,是因为执行调用函数改变了实参指针变量的值,并不是改变了实参指针变量所指变量的值

一维数组指针变量

数组名(如arr)代表元素的首地址,数组第一个元素的地址也是这个数组的首地址(如&arr[0])。

数组指针中使用加减1将跳到下一个或者上一个数组元素地址,与使用 &arr[n+1] 基本相同。

如果整数数组名为arr,运行int *p=arr,则*(p+3)、p[3]、*(arr+3)、arr[3]效果均是取出数组arr的第三个元素,在编译时arr[3]实际上是*(arr+3)处理的。

#include<stdio.h>voidmain(){intarr[] = {5,4,3,2,0};int*p = arr;int*pp = &arr[0];printf("%d", *(p+3));//输出2}

函数数组参数

#include//等价于void fun(char a1[]) {voidfun(char *a1){    *(a1 +2) ='c';//改变第二个值的内容}void main() {    char b1[] = {"123456789"};fun(b1);    printf("调用函数后:%s", b1);//输出: 12c456789}

二维数组指针变量

#include<stdio.h>void main() {inta1[][3] = { {10,11,12},{100,110,120} };inta[][3] = {10,11,12,100,110,120};printf("地址:%d==%d==%d==%d", a[0], &a[0][0],*(a+0),a+0);//输出地址printf("%d===%d==%d", a[0][1], *(*(a +0)+1),*(a[0]+1));//得到值}

指针引用字符串

字符串常量【char *ch = "dong xiao dong";】表示其指向地址的内容不可变,但指向的地址是可变的;

字符串变量【char ch[] = "dong xiao dong";】其指向地址的内容可变。

#include<stdio.h>voidmain(){//char *ch = "dong xiao dong"; //字符串常量,不可变 charch[] ="dong xiao dong";//字符数组,可变ch[2] ='2';//字符串常量运行这条将报错printf("%s\n", ch);}

可变格式的输出函数:

#include<stdio.h>voidmain(){char*ch ="dong xiao %d\n";printf(ch,10);    ch ="xiaoxiao%d\n";printf(ch,10);charchh[] ="dongdong %d\n";printf(ch,100);}

指向函数的指针

【int(*p)(int, int);//定义一个函数指针变量p】,第一个int表示返回值类型,第二个int和第三个int表示函数的参数类型。注意*p两侧的括号不能省略,表示p先与*结合,是指针变量,然后再于后面的()结合,()表示是函数,即该指针变量不是指向一般的变量,而是指向函数。如果写成“int * p(int,int);”,由于()优先级高于*,它相当于“int *(p(int,int))”,就成了声明一个p函数,并且这个函数的返回值是指向整型变量的指针。

返回值为int

#include<stdio.h>voidmain(){intminto(inta,intb);//函数声明int(*p)(int,int);//定义一个函数指针变量pp = minto;//函数指针指向函数minto首地址intcc = (*p)(11,55);//调用函数printf("Min===%d", cc);}intminto(inta,intb){if(a > b)returnb;elsereturna;}

无返回值:

#includevoid main() {    voidfun(int a);//函数声明void (*p)(int);//定义一个函数指针变量pp =fun;//函数指针指向函数fun首地址(*p)(11);//调用函数}voidfun(int a){    printf("%d\n", a);  }

指向函数指针作为函数的参数

#include<stdio.h>voidmain(){intfun(int(*addpp)(int,int),intx,inty);//函数声明intadd(inti,intj);intii=fun(add,11,12);//传递函数名和参数即可printf("输出相加的值为:%d", ii);  }//int (*addpp)(int,int);addpp=add;intfun(int(*addpp)(int,int),intx,inty){intcc = (*addpp)(x, y);returncc;}intadd(inti,intj){returni + j;}

返回指针的函数

#include<stdio.h>voidmain(){int*add(inti,intj);int*p = add(10,4);printf("输出相加的值为:%d", *p);  }int*add(inti,intj){intaa = i + j;return&aa;//返回地址}

指针数组

一个数组其全部元素都存放着指针,就是指针数组【int * p[5];】

#include<stdio.h>voidmain(){//指针数组char* p[] = {"dong1","xiao2","dong3","dong4"};printf("%s\n", p[2]);  }

进阶版

#include<stdio.h>voidmain(){//指针数组(字符串)char* p[] = {"dong1","xiao2","dong3","dong4"};char**pp;    pp = p;printf("%s\n", *(pp+1));//转换一次就可以拿到对应字符串的首地址通过%s打印//指针数组(整数)inta[5]= {10,11,12,13};int* ip[] = { &a[0],&a[1],&a[2],&a[3],&a[4]};int**ppp = ip;printf("%d\n", *(*ppp+1));//转换第一次得到存储的指针,再次转换得到值}

错误示范

1、

int *p=10; //等同于:int *p; p=10;

分析:非法操作,内存地址不能用户自定义。10相当于一个内存地址,该内存地址的值不确定且也不明确该地址是否可以直接访问,正确的应该是使用【&变量名】得到内存地址。

2、

intf =12.3;int*p;*p = &f;//错误1intff = &f;//错误2

分析:指针(地址)必须赋值给指针变量

如果有想学习c++的程序员,可来我们的C/C++学习扣qun:589348389,

微信公众号:java大世界(现在是发布c++学习干货哦,没有java)

免费送C++的视频教程噢!

我每晚上8点还会在群内直播讲解C/C++知识,欢迎大家前来学习哦。

相关文章

  • C语言指针收藏

    指针是什么 》》每一个内存单元只能同时存储一个数据,如何保证内存单元同时只能存储一个数据,可以使用编号的方式实现内...

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • C语言指针总结大学霸IT达人

    C语言指针总结大学霸IT达人 C语言的指针是C语言区别其它语言的最主要的特定之一。有了指针,C语言就可以抛开所有束...

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • 在Swift中使用C语言的指针

    在Swift中使用C语言的指针 在Swift中使用C语言的指针

  • [Swift]结构体指针操作

    C语言的指针操作 在c语言中申明一个变量并通过指针修改该变量的值 a value is 2 c语言操作结构体指针操...

  • Go语言-指针

    Go语言中的指针不同于C语言,Go语言的指针使用方法要简单很多。当然和C语言从指针定义到指针的使用都有很大的不同。...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

网友评论

      本文标题:C语言指针收藏

      本文链接:https://www.haomeiwen.com/subject/llazfctx.html