c语言指针

C语言-指针

泄露秘密 提交于 2020-02-11 06:53:43
无指针,不自由 --1-- 为什么要使用指针 1.1 指针的基本概念 1.2 使用指针的好处 1.3 变量的存储方式 --2-- 指针变量 2.1 指针变量 2.2 定义一个指针变量 2.3 指针变量的初始化方法 2.4 使用 * 获取指针对应存储区域的内容 --3-- 存储细节 3.1 变量及指针变量 --4-- 常见的应用场景 4.1 指针常见的应用场景 --5-- 多级指针介绍 5.1 二级指针 5.2 多级指针介绍 ---------------------------- 【写在开头:】 『 生活中的指针: 没错,就是一个门牌号。 指针是 C 语言中最重要的内容之一。 为什么要使用指针? 如果你想要查找一篇资料,给你一本厚重的百科全书,而你只需要其中第3001页的内容。 那么,3001页,就是指针。如果没有这个指针...好吧,我去旁边哭会儿... 』 --1-- 为什么要使用指针 1.1 指针的基本概念 内存单元的编号也叫做地址,根据内存单元的编号或地址就就可以找到所需的内存单元。 所以通常也把这个地址称为指针 1.2 使用指针的好处 1 )为函数提供修改调用变量的灵活手段 2 )让函数有多个返回值 3 )可以改善程序的效率   在数据传递时,如果数据块较大(比如数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,既提高传输速度,又节省了大量的内存 4

c语言基础2指针

冷暖自知 提交于 2020-02-11 06:07:42
--------- 指针的详解 --------- 指针的定是 int * a; b = 1; a=&b 可以看出来,a这个指针变量存的是b的地址。 可以变形为int *a=&b *d 表示访问位置100,并取得里面的值。 一个常见的错误,int *a ;*a= 12;但是a究竟指向哪里呢,由于我们没有对a进行初始化,所以我们没有办法预测12这个值究竟存在哪里。如果变量是静态的 它会被初始化为0,如果是自动的它根本不会被初始化,无论哪种情况,声明一个 指向整型的指针都不会创建用于存储整型的内存空间。 所以程序执行这个赋值操作,将会发生什么呢?如果你运气好,a的赋值是个非法地址,这样赋值语句将会出错 标准定义了空指针,NULL指针,它作为一种变量特殊的指针变量,表示不指向任何东西,要使一个指针变量变为NULL,你可以给他附一个零值。为了测试一个指针是否为空 可以将他与零值进行比较,之所以选择零值是因为一种源代码约定,就机器语言而言,NULL指针的实际值可能与此不同,在这种情况下,编译器负责将零值和 内部值之间进行转换。 NULL指针的概念非常有用,因为他给了你一种方法,表示某个特定的指针目前并未指向任何东西。例如一个用于在某个数组中查找某个特定值的函数可能返回一个 指向查找到得数组元素的指针。如果该数组不包含指定条件的值,函数就返回一个NULL指针

C语言------指针

好久不见. 提交于 2020-02-11 05:28:46
1. 每个字节包含8个位,为了存储更大的值,我们把两个或更多个字节合在一起作为一个更大的内存单位。每个字一般由2个或4个字节组成。需要注意的是,尽管一个字包含了4(或2)个字节,它仍然只有一       个地址。 2. 指针的初始化是用&操作符来完成的,它用于产生操作数的内存地址。 3. 一个变量的值就是分配给这个变量的内存位置所存储的数值,即便是指针变量也不例外。 4. 通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing the pointer)这个用于执行间接访问的操作符是单目操作符 “*”。 5. 对指针进行解引用操作可以获得它所指向的值。从定义上看,NULL指针并未指向任何东西。因此,对一个NULL指针进行解引用操作是非法的,在对指针进行解引用操作前,你首先必须确保它非NULL指针 6. 对所有的指针变量进行显式的初始化是种好做法,如果你已经知道指针将被初始化为什么地址,就把它初始化为该地址,否则就把它初始化为NULL,风格良好的程序会在指针解引用之前对它进行检查,这种初始化策略可以节省大量调试时间。 7. 变量(除了const变量外)都是左值。指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。 8. 指向指针的指针。例如:*b = &a; c = &b; 那么**c就是指向指针的指针。  

C语言——什么是指针?

谁都会走 提交于 2020-02-11 05:21:22
去年学C语言课时,初步了解了指针的概念,能看懂一些简单的含有指针的程序,但事实上对于指针并没有真正的弄明白它的使用,这点我在半年后的数据结构课程上才深刻的体会到和别人的差距。更加可怕的是,对于当时所得的一知半解,现在已经忘的八九不离十了,所以决定进行C语言核心部分的重修,巩固自己的基础。 1.什么是指针? 定义一个变量,系统会为它分配内存单元,内存区的每一个字节有一个编号,即“地址”。 我们可以通过地址找到所需的变量单元,即:地址指向该变量单元。而这个地址便被形象化的称为“指针”。即: 一个变量的地址称为该变量的指针。 2.什么是指针变量? 定义一个变量,专门用它来存放另一个变量的地址,这个变量被称为指针变量。指针变量的值是地址(指针)。 3.指针变量的定义。 int *p;//类型名 * 指针变量名; ***注意:指针变量p前面的 *,指针运算符,表示的是“指向” ,表示该变量的类型为指针型变量。在定义指针变量时必须指定基类型。 int a,b; int *p1,*p2;//定义两个指向int的指针变量p1,p2 p1=&a;//a的地址赋给指针变量p1 p2=&b;//b的地址赋给指针变量p2 ***注意: &,取地址运算符,&a是变量a的地址 。 4.指针变量的引用。 *p1=100;//将100赋给p指向的变量,即变量a=100 printf("%d",*p1);/

c的详细学习(10)结构体与共用体的学习(二)

橙三吉。 提交于 2020-02-11 04:47:24
在c语言中,结构体数据类型与共用体数据类型都属于构造类型。共用体与结构体数据类型在定义上十分相似,但它们在存储空间的占用分配上有本质的区别。结构体变量是各种类型数据的集合,各成员占据不同的存储空间,而共用体变量的所有成员占用相同的存储空间,在某一时刻只有一个成员起作用。 (1)共用体类型的定义 定义共用体类型的一般形式: union 共用体类型名 { 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名3; ...... }; 以上定义了一个名为data的共用体类型。它说明该类型由三个不同类型的成员组成,这些成员共享同一块存储空间。 (2)共用体变量的定义 与结构体变量的定义类似; (3)共用体变量的引用和初始化 1.引用共用体变量中的一个成员 引用共用体变量的成员的一般形式 共用体变量名.成员名 共用体指针变量->成员名 第一种引用方式应用于普通共用体变量,第二种引用方式应用于共用体指针变量。 union data a,*p=&a; 2.共用体类型变量的整体引用 可以将一个共用体变量作为一个整体赋给另一个同类型的共用体变量。例如: union data a,b; ...... a=b; 3.共用体变量的初始化 在共用体变量定义的同时只能用第一个成员的类型值进行初始化,共用体变量初始化的一般形式: union 共用体类型名 共用体变量={第一个成员的类型名}; 例如:

IOS笔记-C语言中的指针与数组

蹲街弑〆低调 提交于 2020-02-11 03:53:29
1、指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型 *指针变量名; 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p = &a[0]; // &a[0] == a int *p1 = a; ii.用数组的指针访问数组元素 偏移:指针变量的偏移 p1 = p1+1; //向下偏移1个一个数组元素 p1++; //p1中存放的还是地址 .... 如果用指针访问第i个元素 p1+i 取出pi指向的元素的值:*(p1+i); == a[i]元素的值 具体地址值计算:p1+sizeof(数组的类型) 指针数组(数组中的每个元素都是指针) 数组中的每一个元素还是一个指针 int a[3][3]={11,2,3,4,5,6,7,8,9}; a[0] //行地址 a[1] a[2] //pa就是一个指针数组 int *pa[3]={a[0],a[1],a[2]}; 2)指针与二维数组 数组指针(指向数组元素的指针) 特定的格式: int (*p3)[3]; //定义一个指向二维数组的指针,而且二维数组的第二维长度要是3 int b[3][3]; p3 = b; int b1[2][3]; p3 = b1; int b2[2][2]; p3 = b2; //编译器给警告 用指针对二维数组的遍历 int a[3][3] ={1

C语言:指针的几种形式

╄→尐↘猪︶ㄣ 提交于 2020-02-11 02:57:58
字符串的两种形式: 1、字符数组 char name[32] = “zhangsan”; //只能在初始化时这样做 strcpy(name,”lisi”); //整体赋值只能通过strcpy name = “lisi”; //error,将一个常量字符串的地址(“lisi")赋值给常量指针(char* const name) 2、字符指针 char *name = “zhangsan”; //指针变量name指向了常量字符串的开始地址 char* name; //在使用野指针(未初始化的指针) scanf(“%s”,name); //error, strcpy(name,”lisi”); //error,如果name指向了常量的字符串,会崩掉。 如果name没有初始化,程序有可能会崩掉,也有可能会覆盖内存中的数据。 name = “lisi”; //ok,重新修改指针变量name的指向,即指向一个新的字符串地址。 1、const int* p和int const* p:两者意义是相同的。指向的内容是只读数据,不可以q改变;但是指向的地址可以改变。 2、int* const p:必须先对指针初始化,而且指向的地址是只读的,不可以再被改变;但是指向的内容可以改变。 3、const int* const p:既不可以改变指针指向的地址,也不可以改变指针指向的内容。 来源: https:/

C语言------结构体和共同体

给你一囗甜甜゛ 提交于 2020-02-11 01:07:37
1.结构体是一种构造类型,它是由若干成员组成的,其中每个成员可以是一个基本数据类型或者是一个构造类型。声明结构体时使用关键字struct。 2..声明一个结构体表示的是创建一个新的类型名,要用新的类名再定义变量,定义方式有三种:   A.声明结构体,然后再定义变量。     struct Product     {成员列表};     struct Product product1;     struct Product product2;   B.在声明结构类型时,同时定义变量。     struct Product     {       char cName[10];       char cShape[20];     }product1, product2;     PS:注意变量的名称要放在最后的分号前面;定义的变量不是只能有一个,可以定义多个变量    C.直接定义结构体类型变量。     struct     {       成员列表     }变量名列表; 3.在引用结构体的成员时,可以在结构的变量名的后面加上成员运算符"."和成员的名字,例如:product1.cName 4结构体类型与其他基本类型一样,可以在定义结构体变量时指定初始值。例如:   struct Student   {     char cName[20];     char cSex;    

「C」 数组、字符串、指针

三世轮回 提交于 2020-02-10 23:06:51
一、数组 (一)数组   概念:用来存储一组数据的构造数据类型   特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。 (二)数组的定义   格式: 类型 数组名[元素个数];   举例:存储5个人的年龄   int agrs[5]; // 在内存中开辟4x5=20个字节的存储空间   可以在定义数组的同时对数组进行初始化:   int ages[5] = {17,18,19,20,21};   遍历数组:   for(int i = 0;i<5;i++)   {     printf(“ages[%d]=%d\n”,i,ages[i]);   }   注意:   (1)数组的初始化     ①. int ages[5] = {17,18,19,20,21}; // 一般写法     ②. int ages[5] = {17,18}; // 只对前两个元素赋值     ③. int ages[5] = {[3]=10,[4]=11}; // 对指定的元素赋值,这里为第三个和第四个     ④. int ages[] = {11,12,13}. // 正确,右边的元素确定,则个数可以省略这里为3个。     ⑤. int ages[]; // 错误,编译器无法知道应该分配多少的存储空间     ⑥. int ages[5];ages = {17

关于链表中指针的学习

女生的网名这么多〃 提交于 2020-02-10 19:28:46
  昨天晚上在学习数据结构关于链表的部分,理解链表没什么难度,但是当自己动手写程序的时候各种问题就出来了,感觉逻辑很正常但是总得不到正确的结果。 首先自己对C语言指针理解的不是很深入,在定义链表节点的结构体时,定义了一个指针类型的变量指向结构体如代码所示:    1 typedef int status; 2   typedef struct Node{ 3    status data; 4    Node *next; 5   }Node,*linklist;   然后在main函数中定义一个指向结构体的指针变量如 linklist L;   在main函数之外声明一个创建链表的函数    1 void Create_list(linklist L1,int n){ 2    linklist p; 3    L1 = (linklist)malloc(sizeof(Node)); 4    L1->next = NULL; 5    for(i = 0;i < n; i++){ 6    p = (linklist)malloc(sizeof(Node)); 7    p->data = i; 8    p->next = L1->next; 9    L1->next= p; 10   } 11   } Create_list函数采用的事头插法添加链表节点,经过main