指针数组

C语言指针总结

╄→尐↘猪︶ㄣ 提交于 2020-02-11 07:15:44
C语言中的精华是什么,答曰指针,这也是C语言中唯一的难点。 C是对底层操作非常方便的语言,而底层操作中用到最多的就是指针,以后从事嵌入式开发的朋友们,指针将陪伴我们终身。 本文将从八个常见的方面来透视C语言中的指针,当然,还有其他没有具体提到的方面,像指针表达式、指针安全等问题,以后有机会我再慢慢补充。 还是那句老话,重要的是实践,多写代码,才是学好C语言的关键。 1.指针类型分析 分析指针,可以从变量名处起,根据运算符优先级结合,一步一步分析. int p; //这是一个普通的整型变量 int *p; //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int 型.所以 P是一个返回整型数据的指针 int p[3]; //首先从P处开始,先与[]结合,说明P 是一个数组,然后与int结合,说明数组里的元素是整型的,所以 P是一个由整型数据组成的数组 int *p[3]; //首先从P处开始,先与[]结合,因为其优先级比*高,所以P是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与 int结合,说明指针所指向的内容的类型是整型的,所以是一个由返回整型数据的指针所组成的数组 int (*p)[3]; //首先从P处开始,先与*结合,说明P是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级)

C语言 ---- 指针 iOS学习-----细碎知识点总结

萝らか妹 提交于 2020-02-11 07:15:27
内存的访问形式:1、直接访问:通过变量名进行访问。2、间接访问:先找到变量存放的地址,然后根据地址去访问对应的内存空间。 指针--- // 定义一个整形指针变量,用来存储num1在内存中的地址 int *p = NULL; // 定义一个整形指针变量,指向0x0,NULL恒等于0 printf("%p\n", p); // 输出指针变量的值,使用"%p" printf("&num1 = %p\n", &num1); // 取址运算符,取得变量所在的内存地址 p = &num1; // 给整形指针变量重新赋值 printf("p = %p\n", p); printf("*p = %d\n", *p); // "*"取值运算符,取出地址里面存储的数据 // 当我们定义指针变量的时候,"*"只是起一个标识作用,告诉我们这个变量是一个指针变量。 // 当我们使用指针变量的时候,"*"表示的是从当前地址里面取出存储的数据。 // 指针的算术运算,只有加和减 int num1 = 100; int num2 = 200; int *p = &num2; printf("*p = %d\n", *p); printf("*(p + 1) = %d\n", *(p + 1)); // p + 1是指针向高位移动n个字节,n指的是指针指向的数据类型所占有的字节数(int *p移动4个字节,

黑马程序员-----结构体数组

别等时光非礼了梦想. 提交于 2020-02-11 07:15:00
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ----- 第一讲 结构体数组 一、结构体数组的概念 数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下表结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。 二、结构数组定义 定义格式: struct 结构名{ 成员表列 }数组名[数组长度]; 例如:定义一个长度为5的数组,其中每一个元素都是stu结构类型。 struct stu{ int num; char *name; char sex; float score; }boy[5]; 定义了一个结构数组boy,共有5个元素,boy[0]~boy[4].每个数组元素都具有struct stu的结构形式。 1 /* 2 结构体数组: 3 4 用来存放大量的结构体相同的结构体变量。 5 6 结构体数组定义: 7 8 结构体数组定义的第一种方式: 9 1.定义结构体的同时,定义数组 10 struct Student{ 11 int age; 12 char *name; 13 int sno; 14 float score; 15

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就是指向指针的指针。  

指针的用法

我的未来我决定 提交于 2020-02-11 04:40:49
大家都应该知道, 指针是个什么玩意儿, 它就是用来存另一个变量的地址的。这玩意儿在程序中容易引起不易察觉的错误, 而且会给调试带来莫大的困难。 尽管如此,它现在依然存在着, 这就从另一方面说明了, 它的功能爆表。 在实现链式存储, 图, 树, 森林时, 大都要用指针。 不仅如此, 在访问多维数组,函数参数传递时, 也多用指针。下面给出指针的一些常用的用法代码。      /*指针的声明及一般用法*/ /*________________________________________________________________*/ //声明: int a; int *p=&a; int a; int *p; p=&a; #include<stdio.h> int main() { int a, b; int *ipointer1, *ipointer2; scanf("%d%d", &a, &b); ipointer1 = &a; ipointer2 = &b; printf("The number is:%d %d\n", *ipointer1, *pointer2); } #include<stdio.h> int main() { int *p, q; p=&q; scanf("%d", p);//另类写法。 printf("%d\n", q); return 0; }

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

指针总结与地址

倾然丶 夕夏残阳落幕 提交于 2020-02-11 02:11:52
指针是为了方便对地址直接操作而增加的一个中间操作符。 根据软件中间层的概念: 变量直接由高级操作; 地址直接由低级语言操作; 指针贯通高级语言与低级语言之间,是一个幽灵类型,直接对内存地址和内存地址中的数据双向操作。 最近在温故《C ++ primer》这本书,其中有一句话非常经典: When attempting to understand pointer declarations, read them from right to left. 为什么要有指针: 内存寻址的变种,是内存操作的接口; 方便数据在内存层面的组织;是数据结构的的核心支持; 是内存管理的有效工具; 提供了控制流跳转的开发层面支持。 变量:内存内容的标示;编程语言的直接操作对象;实质是操作内存对象; 存在于可执行文件的符号表中;在进程中没有存在,进程中只有内存数据。 指针的概念:(变量、类型、访问) 1)指针变量是一种特殊的变量; 2)指针变量作为变量,里面的数据是内存地址; 3)指针的类型决定了指针访问的内存大小; 4)指针内容语意:指针变量包含地址指向的内存单元的内容。 变量是与数据对应的概念。 指针变量是与内存地址对应的概念。 指针的本质是内存地址;变量的本质是内存数据。 指针可以无差别的访问进程的任何内存单元。 指针的操作: 指针的操作提供了内存的便捷访问方式(遍历、查询)。 指针的形式: 一

「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

指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数

坚强是说给别人听的谎言 提交于 2020-02-10 19:30:11
 1、指针数组 数组里面的每一个元素都是指针。 指针数组的案比例如以下: 易犯错误: 2 、数组指针 归根结底还是指针,仅仅是取 * 的时候可以取出一整个数组出来。 数组指针:(一个指针指向了数组。一般和二维数组搭配使用)。 以下的( p+1 )表示的是加过 20 个字符。 3 、函数指针: 在 gcc 编译的时候添加一些调试信息的方式是: gcc demo.c –g –o app -g 表示添加一些调试信息 objdump –dSsx app > file 将 app 反汇编。然后重定向到 file 文件里。函数指针定义: 4 、指针作为參数 sizeof(p) sizeof(*p) p+1 char * p[10] 40 4 加过 4 个 Byte char **p 4 4 注意 sizeof ( **P ) = 1 加过 4 个字节 char (*p)(void) 函数指针 4 无大小 无意义 char (*p)[20] 数组指针 20 5 、 main 函数实质介绍: 6 、二重指针: 指针数组和二重指针实际上是等价的。 7 、数组指针等价于二维数组: 8 、函数指针作为函数的參数 9 、泛型函数: #include <stdio.h> #include <time.h> #include <stdlib.h> void show_arry(int a[], int n