数组、指针

---恢复内容开始---

1、数组初始化

  使用花括号对括起来一系列数值来初始化数组。数值之间用逗号隔开,在数值和逗号之间可以使用空格分开。

  int main(void)

  {

    int power[8] = {1, 2, 3, 4, 5, 6, 7, 8};

    .......

  }

  a、如果数组不初始化,数组内的值都是随机的。

  b、如果数组内的值没有全部都初始化,未初始化的值都是0。

  c、可以对数组内的某个指定的元素初始化,未被初始化的值都将被设置为0。

    例如 int attr[6] = { [4] = 3 }; -----即是将数组attr的第5元素的值设置成3.

2、为数组赋值

  声明完数组后,可以借助数组的索引(即下标)对数组成员进行赋值。C不支持将数组看做一个整体来进行赋值,也不支持用花括号括起来的列表形式进行赋值(初始化除外)。

  int main()

  {

    int one[4] = {1, 2, 3, 4};       /*正确*/

    int two[4];

    two = one;                          /*不允许*/

    two[4] = one[4];        /*错误*/

    two[4] = {2, 3, 5, 9};      /*不起作用*/

  }

3、数组边界

  使用数组的时候,需要注意数组索引不能超过数组的边界。

4、未初始化的指针

  int *pt;  //未初始化的指针

  *pt = 5;  //可怕的错误

  切记:当创建一个指针时,系统只分配了存储指针本身的内存空间,并不分配用来存储数据的内存空间。

  所以在指针使用之前必须给他赋予一个已经分配的内存空间。例如1、把指针指向一个已经存在的变量 2、用malloc函数申请新的空间。

5、指针的操作

  1、赋值------把一个地址赋给一个指针。

  2、求值------运算符*可以取出指针指向地址中存的值。

  3、去指针的地址------指针也是有地址和数值的,用运算符&可以取出指针的地址。

  4、将一个整数加给一个指针------即是这个整数乘以指针所指类型的字节数,然后所得结果加上初始的地址上。

  5、求差值------可以求出两个指针间的差值,即是元素之间的距离。

  6、比较------可以使用运算关系比较两个指针的大小,前提是两个具有相同的类型。

6、保护数组内容

  在编写处理诸如int这样基本类型的函数时,可以向函数传递int数值,也可以向函数传递指向int的指针;通常我们只传递数值,只有需要在函数中修改该值的时候,我们才传递指针。

    对于处理数组的函数,只能传递指针,因为这样更高效。如果传递数组,那么系统需要再申请一份内存传递给函数。

  对形式变量使用const,即是要求函数将传进来的地址指向的值当做常量对待。

  对const的理解:const不是要求原始数组固定不变;只是说明函数在处理数组时,应该把数组当作是固定不变的。

    总之,如果函数想修改数组,那么在声明函数参量时不要使用const;如果函数不想修改数组,那么在声明函数参量时最好使用const。

7、指针赋值和const

  1、将常量和非常量数据的地址赋给指向常量的指针时合法的。也就是说const指针可以指向const类型数据的地址,也可以指向普通类型数据的地址。

  2、只有非常量的数据才能赋给普通指针。也就是说非const指针不能指向const类型数据的地址。

  3、可以使用const声明并初始化指针,以保证指针不会指向别处。也就是说const声明并初始化了的指针,不能再被赋值;这样的指针仍然可用于修改数据,但他只能指向最初赋给他的地      址。

  4、可以使用两个const来创建指针,这样的指针既不能修改指向的地址,也不能修改指针指向的值。

---恢复内容结束---

时间: 2024-10-21 10:56:34

数组、指针的相关文章

数组指针和指针数组的区别

数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的长度. 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组. p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;       //该语句执行过后,也就是

指针数组 数组指针

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针 数组指针:a pointer to an array,即指向数组的指针 还要注意的是他们用法的区别,下面举例说明. int* a[4]     指针数组 表示:数组a中的元素都为int型指针 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于* int (*a)[4]   数组指针 表示:指向数组a的指针 元素表示:(*a)[i] 注意:在实际应用中,对于指针数组,我们经常这样使用: 1

收藏的数组指针知识点

首先是简单的一维数组 定义一个数组int arr[5]; arr是指向数组第一个元素的int类型指针,arr+1就是指针数组第二个元素的int类型的指针,*arr就是取这个指针里面对应的值,这个比较好理解 int arr[5] = { 1, 2, 3, 4, 5 };//定义数组 printf("\n%x", *arr);//1 =arr[0] printf("\n%x", *(arr+1));//2 =arr[1] 到了二维数组这边比较蛋疼,找了很久找到一句话来解

数组指针与二维数组的寻址

引例:已知如下程序 1 #include <stdio.h> 2 main() 3 { 4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; 5 int (*p)[4] = x, k = 1, m, n = 0; 6 for(m=0; m < 2; m++) 7 n += *(*(p+m)+k); 8 printf("%d\n",n); 9 } 试写出程序的输出值.(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在实践中练出

C语言学习笔记(6):如何从变量声明的表面上来区分指针数组和数组指针

举例:int *p[5]是指针数组int (*p)[5]是数组指针区分两者只要看变量名p周围的修饰符即可. 这里要明确两点:1.不论int *p[5]还是int (*p)[5]都不应该看成一个整体,而应该看成一些修饰符来修饰变量p,从而使p得到准确定义:2.[]的优先级要比*高,相同优先级修饰符,采取从左向右的编译方式. *p[5]由于[]优先级高所以[]先修饰变量名p,所以p是一个数组名,然后再看其它修饰符,可以发现是一个int * 类型的数组,即p为指针数组. (*P)[5]由于()和[]两

golang 数据一 &nbsp; (字符串、数组和数组指针)

从如下几个方面介绍GO语言的数据 1. 字符串 2. 数组 3. 切片 4. 字典 5. 结构 字符串 Go语言中的字符串是由一组不可变的字节(byte)序列组成从源码文件中看出其本身是一个复合结构 string.go  type stringStruct struct {     str unsafe.Pointer         len int } 字符串中的每个字节都是以UTF-8编码存储的Unicode字符字符串的头部指针指向字节数组的开始但是没有NULL或'\0'结尾标志. 表示方式

数组指针、指针数组、函数指针、指针函数 -----笔记

1.数组的四种访问方式 定义数组 a[]; 指针 *p 指向数组a; (1) 利用数组的下表进行访问 a[i]; (2) 数组名+地址的偏移量i *(a+i) (3) 利用指针 p 进行下表访问 p[i] (4) 指针p + 地址的偏移量i *(p+i) 一维数组数组名:相当于一个单指针 2. 数组指针(指针)     指针数组(数组) 函数指针(指针)     指针函数(函数)    -------->只看后边两个字就能够区分是指针还是数组或函数 _______________________

C/C++笔试篇-------二维指针数组、数组指针的用法

1.废话不多说,先上代码: #include <iostream> using namespace std; int main(void) { int v[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; int (*a)[5] = v; //指针数组,指针指向数组 a[5],a[5]里面是int数值 该指针等于v的地址 cout<<(*a+1)<<endl; //*a是v[0][0]的地址. 0x22fe04 cout<<(*a+2)

C++指针数组和数组指针

指针相关问题 using namespace std; int main(){ //a) 一个整型数( An integer) int a; //b) 一个指向整型数的指针( A pointer to an integer) int *b; //c) 一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an integer) int **c; //d) 一个有 10 个整型数的数组( An array of 10 integers) int

指针数组和数组指针

指针数组:首先它是一个数组,数组的元素都是指针.它是“储存指针的数组”的简称.int *p1[10];数组指针:首先它是一个指针,它指向一个数组.它是“指向数组的指针”的简称.   int (*p2)[10]; 这里需要明白一个符号之间的优先级问题,关键在于p1.p2先和谁结合.“[]”的优先级比“*”要高.p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,int *修饰的是数组的内容,即数组的每个元素.那现在我们清楚,这是一个数组,其包含 10 个指向 int 类型数据的指针,即指针