C语言指针和数组

C语言指针和数组

binsearch else-if  shellsort  insertsort

指针和地址

指针是编程语言中的一类数据类型及其对象或变量,用来表示或存储一个内存地址,这个地址的值直接指向(points to)存在该地址的对象的值

取值运算*p返回保存在内存地址为p的内存空间中的值。取地址&p运算则返回操作数p的内存地址

C语言是以传值的方式将参数值传递给被调用函数,被调用函数不能直接修改主调函数中的值,需要修改主调函数中的值就需要利用指针

指针和数组

数组名代表的是该数组的第一个元素的地址,对于a[i]的引用可以写成*(a+i)或者*(pin + i)或者pin[i],通过数组名和下标实现的表达式可等价通过指针和偏移量实现

int a[10];
int *pin;
pin = &a[0];
pin = a;
pin = pin + 1;
pin = &a[1];
pin = a + 1;

不同的是数组名和指针之间,数组名代表的是一个常量,相反指针代表的是一个变量,因此pin = apin++是合法的,而a = paa++是错误的

地址算术运算

指针可以进行比较运算:指向同一个数组的指针可以进行== <= >= !=

同样指针可以进行与整数相加或相减运算,如p+n其中n的长度不是固定的,会随着指针等比例的缩放,减法也是相同的

指向同个数组的两个指针可以相减或者比较运算如p-q+1代表两指针之间的元素个数

指针不可进行上述以外的其他运算,如两指针之间的相加运算、乘除运算等,同double或者float之间的加减运算,以及强制转换运算

字符指针和函数

字符串常量就是一个字符数组:"I am a string",在内部表示中字符和\0组成

char amessage[] = "now is the time";  //定义一个数组
char *message = "now is the time"; //定义一个指针

对于第一种情况,定义了一个数组,其中amessage指向这个字符数组的第一个字符,固定不变,数组中的单个字符可以进行修改。而对于第二种情况,message指向一个字符串常量,只是将一个指向该字符串常量的指针赋值给了message,并没有进行字符串的复制,只是涉及到指针的操作,C语言没有提供处理整个字符串的运算符。

指针数组以及指向指针的指针

指针数组和数组指针的区别,指针数组就是一个数组,而这个数组的每一个元素都是一个指针;数组指针是一个指针,而这个指针指向一个数组

int a[10];
int *p[10];
int (*p)[10] = &a; //数组指针的使用

enter description here

a&a的区别,对于a数组名的值就是一个指针常量,也就是指向数组的第一个元素(代表第一个元素的地址),&a指向的是整个数组,然而&aa的值相同,不同的是&a+1a+1代表的含义不同,&a+1增加了整个数组的长度,a+1增加了一个元素的长度(a[1]

多维数组

daytab[i][j]表示一个二维数组,如果要将一个二维数组作为一个参数传递给函数,那么必须在函数声明中指明数组的列数(与数组的行数没有多大的关系)。怎么解释啦?向函数传递的是一个指针,这时就是传递的就是一个具有j个元素的行向量,也就是前面所说的数组指针

可以从上面的多维数组可以得出:数组指针的每一行的长度相同。这也是和指针数组不同的地方,指针数组的每个指针指向的长度可以不一样

char *name[] = {
"illegal month", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
}

上面定义的就是一个指针数组的初始化,每个元素的长度都不一样,name[0](或者name)指向的就是第一个元素

命令行参数

在支持C语言的环境中,可以在程序开始时将命令行参数传递给程序。调用主函数main时,它带有两个参数,第一个参数(习惯为argc,用于参数计数)表示命令行中参数的数目,第二个参数(习惯为argv,用于参数向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数

int main(int argc, char *argv[])

argv[0]表示函数名,因此argc的值至少为1,第一个可选参数为argv[1],最后一个可选参数为argv[argc - 1]

时间: 2024-10-05 23:47:59

C语言指针和数组的相关文章

c/c++(疑3) C语言指针与数组之间关系

c/c++ (疑1)数组和指针 c/c++(疑2) const extern 有了前面 两篇 基础,下面我们可以更深入的来介绍c/c++(疑3) C语言指针与数组之间关系 1 概述(C语言指针与数组之间关系) 指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址.指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到. 数组就是数组,其大小与元素的类型和个数有关.定义数组时必须指定其元素的类型和个数.数组可以存任何类型的数据,但不能存函数. 2    

程序设计基石与实践之C语言指针和数组基础

英文出处:Dennis Kubes:  <Basics of Pointers and Arrays in C>. 关于C语言中指针和数组的争论就像是一场恶战.一方面,有些人觉得,所有人都必须承认指针与数组是不同的.而另一些人则认为数组被当成指针来处理,因此它们不应该有什么区别.这种现象让人迷惑.然而,这两种说法其实都是正确的. 数组不是指针,指针也不能说是数组.在C语言中,指针仅在内存中代表一个地址,而数组是许多连续的内存块,多个类型相似的元素存储在其中.更深入的解释,请参考我之前的博文&l

C语言指针与数组易混淆知识点(一)

一指针与数组 二指针与函数 三指针数组数组指针指向指针的指针 四程序陷阱 一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容)是跟操作系统的地址位数有关,比如32位地址的系统,那么指针所占的内存单元就是4个字节,16位就是2个字节,因此,指针的类型只是限定它所指向的变量的类型,其内容所占的单元大小是与操作系统的地址位数相关,与变量类型无关. 在32

C语言指针与数组的定义与声明易错分析

部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告诉编译器a这个名字已经在别的文件中被定义了,下面的代码使用的a是在别的文件中定义的.编译器是按文件分别编译的,当a被声明为char* a时,编译器理所当然的认为a是一个指针变量,在32位系统下占用4个byte,这4个byte存放的是地址,地址指向的空间存储的是char类型数据. 程序会返回SIGSEGV. 2

c语言指针和数组的学习总结

数组是由一系列相同的元素构成 const int days[10] = {31, 23, 45, 56, 78,}:用CONST声明定义的数组是是数组常量,声明之后,是 只读 不能在以后使用再单独在改变,除了可以在数组声明中从新赋值,他不要求原数组不能改变,只是说明函数在处理数组的时候,应该把数组当做固定不变的. 数组如果没有初始化完成,未被初始化的空间会自动初始化为0 只有在声明形参的时候 int ar[] 和 int * ar是相同的 C保证在位数组分配存储空间的时候,指向数组之后的第一个位

C语言 指针和数组

1. 指针和一维数组 一维数组名就是一个指针地址常量, 一维数组名的指针地址与数组第一个元素地址相同 原文地址:https://www.cnblogs.com/mycgy/p/8445326.html

C语言指针、数组和函数的一些总结

主要来自于孟宪福老师的分布式对象课程. int a[7][8]; // a指向 a-->a[0]-->a[0][0] a[0]是第0行一维数组 // a + i --> a[i] --> a[i][0] a[i][j]; // 等价于*( *(p + i ) + j) 定义一个函数返回7*8的数组a int ( *f () ) [8] { int a[7][8]; return a; } 总结起来就是: 1. 从标识符开始 a. 定义数组,数组的元素是什么? b. 定义函数,函数的

C编译器剖析_1.5 结合C语言来学汇编_指针、数组和结构体

让我们再来看一份C代码,及其经UCC编译器编译后产生的主要汇编代码,如图1.33所示,其中包含了数组.指针和结构体. 图1.33 数组.指针和结构体 按照C的语义,图1.33第9行的C代码是对局部数组number的初始化,需要把number[0]初始化为2015,而数组中的其他元素皆被初始化为0.UCC编译器采取的翻译方法是:先调用memset函数来把数组number所占的内存空间清0,然后再把number[0]设为2015,如图1.33的第17至24行所示.C库函数memset的API如下所示

《C程序设计语言(第2版&#183;新版)》第5章 指针与数组

指针:保存变量地址的变量:在 C中应用广泛,因为1)指针往往是表达某个计算的唯一途径:2)使用指针往往可以写出更高效紧凑的代码:另一方面,1)指针和goto一样,会导致程序难以理解:2)粗心会很容易导致指针指向了错误的地方: 指针与数组关系密切: ANSI C明确制定了操纵指针的规则,并且使用void*代替char*作为通用指针的类型: 5.1 指针与地址 内存的组织:一系列连续编号或编址的存储单元,单元可以单个操纵也可以以连续成组的方式操纵:通常1个字节可以存放一个char,2个相邻字节可以存