编程小常识:数组的基本知识和有关数组的运算

原创 2018年04月15日 13:56:42
一维数组的一般形式为:类型符 数组名 [常量表达式]
一维数组的使用:1.数组是使用下标来访问的,下标是从0开始。//int arr[10];
                           2.数组的大小可以通过计算得到。                  //int sz=sizeof(arr)/sizeof(arr[0]);
一维数组在内存中的存储:数组在内存中是连续存放的。
一维数组的指针访问:数组的数组名其实就是数组首元素的地址,通过对数组名+整数的运算,就可以获得到数组每个元素的地址。
例:
#include<stdio.h>  
int main()  
{  
 int arr[10]={0};  
 int i=0;  
 for(i=0;i<sizeof(arr)/sizeof(arr[0]);++i)  
 {  
  printf("&arr[%d]=%p\n",i,&arr[i]);//%p取地址  
 }  
 return 0;  
}  
二维数组的一般形式为:类型说明符 数组名[常量表达式][常量表达式]
二维数组的使用:二维数组的使用也是通过下标的方式来访问的。
二维数组在内存中的存储:二维数组在内存中也是连续存放的。
二维数组的指针访问
注意:为了测定字符串的实际长度,C语言规定一个“字符串结束标志”,以字符"\0",作为结束标志。如果字符串数组中存在若干个字符,前面9个字符都不是空字符("\0"),而第十个字符是"\0",则认为数组中有一个字符串,其有效字符为9个。也就是说,在遇到"\0"时,表示字符串结束,并且把它前面的字符当成一个字符串。
char arr[]="abc";//系统默认\0作为字符串结束标志  
char arr[3]={'a','b','c'}//无结束标志  
char*p="abcdef"//*p意为取字符串中首字母地址  
1. 数组名单独放在sizeof()内部,数组名表示整个数组
sizeof(数组名)计算的是整个数组的大小,单位是字节
2. &数组名,数组名表示整个数组&数组名,取出的是整个数组的地址
3. 除此之外所有的数组名都表示首元素的地址
指针的初步介绍:1.内存中的内一个内存单元(字节)对应一个地址。
                           2.在32为的平台上指针的大小是4个字节。64位平台是8个字节。
在C语言中取出某个变量地址
int n=10;  
&n;//取n都地址 
指针可以理解成一个专门存放地址的变量。
指针变量的定义:
int *p=NULL;//定义一个整型的指针变量,初始化为NULL  
char *p=NULL;//定义一个字符的指针变量,初始化位NULL  
当我们拿到指针的时候也要能够找到指针所指向的变量,这里就要用*(解引用操作符)

int n=10;int *p_n=&n;//将n的地址存放在p_n指针变量中。  
*p_n=20;//改变的其实是n这个变量内容。  
strlen与sizeof
strlen()是函数表示字符串长度sizeof()是算符,内部表达式不参与运算
short s=1;  
int n-10;  
printf("%d\n",sizeof(s=n+1));//2  
printf("%d\n".s);//1  
sizeof(数组)的sizeof值等于数组所占用的内存字节数,如:
char a1[] = "abc";  
int a2[3];  
sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL终止符  
sizeof( a2 ); // 结果为3*4=12(依赖于int)

有关数组的运算:运行环境在32位编译环境中
一维数组
#include<stdio.h>  
#include<string.h>  
int main()  
{  
    int a[]={1,2,3,4};  
    printf("%d\n",sizeof(a));  
    //16,计算数组大小,a[]中4个int型元素,一个元素四个字节,大小为16  
    printf("%d\n",sizeof(a+0));  
    //4,(a+0)是计算该数组第一个元素地址的大小  
    printf("%d\n",sizeof(*a));  
    //4,自动取数组a[]首元素地址,并计算大小  
    printf("%d\n",sizeof(a+1));  
    //4,(a+1)是计算该数组第二个元素地址的大小  
    printf("%d\n",sizeof(a[1]));  
    //4,计算该数组第二个元素地址的大小  
    printf("%d\n",sizeof(&a));  
    //4,取出数组的地址,地址为指针,而指针为四个比特位  
    printf("%d\n",sizeof(*&a));  
    //16,*代表解引用符号,实际还是计算a[]数组的大小  
    printf("%d\n",sizeof(&a+1));  
    //4,数组a[]下一个数组地址的大小  
    printf("%d\n",sizeof(&a[0]));  
    //4,数组a[]首元素地址大小  
    printf("%d\n",sizeof(&a[0]+1));  
    //4,数组a[]第二个元素地址大小  
return 0;  
}  

字符数组
#include<stdio.h>  
#include<string.h>  
int main()  
{  
 char arr[]={'a','b','c','d','e','f'};  
 printf("%d\n",sizeof(arr));  
 //6,计算数组大小,arr[]中6个char型元素,一个元素1个字节,大小为6  
 printf("%d\n",sizeof(arr+0));  
 //4,(arr+0)是计算元素地址的大小  
 printf("%d\n",sizeof(*arr));  
 //1,取数组arr[]首元素地址大小  
 printf("%d\n",sizeof(arr[1]));  
 //1,取数组第二个元素地址大小  
 printf("%d\n",sizeof(&arr));  
 //4,取数组地址的大小  
 printf("%d\n",sizeof(&arr+1));  
 //4,取数组arr[]下一个数组地址大小  
 printf("%d\n",sizeof(&arr[0]+1));  
 //4,取数组第二个元素地址  
 printf("%d\n",strlen(arr));  
 //随机值 在该字符串数组中没有'\0'作为结束标志,系统就会从首元素开始寻找'\0'做为结束标志,输出随机值  
 printf("%d\n",strlen(arr+0));  
 //随机值 在该字符串数组中没有'\0'作为结束标志,系统就会从首元素开始寻找'\0'做为结束标志,输出随机值  
 printf("%d\n",strlen(*arr));  
 //运行错误 *arr表示首元素地址,即'a',也就是从地址值为97开始找,但97是一个未知地址,访问的参数不同  
 printf("%d\n",strlen(arr[1]));  
 //运行错误 取arr的第二个元素,原因同上  
 printf("%d\n",strlen(&arr));  
 //随机值 从数组的首元素地址开始寻找'\0',输出随机值  
 printf("%d\n",strlen(&arr+1));  
 //随机值+6 跳过该数组寻找'\0'结束标志,输出上面的随机值+6  
 printf("%d\n",strlen(&arr[0]+1));  
 //随机值+5 从数组第一个元素开始跳过该元素寻找'\0'结束标志,输出上面随机值+5  
return 0;  
}  
#include<stdio.h>  
#include<string.h>  
int main()  
{  
 char arr[]="abcdef";  
 printf("%d\n",sizeof(arr));  
 //7,在该字符串数组中'\0'作为结束标志,也属于终止符  
 printf("%d\n",sizeof(arr+0));  
 //4,取该数组首元素的地址,计算大小  
 printf("%d\n",sizeof(*arr));  
 //1,取该数组的首元素地址,计算大小  
 printf("%d\n",sizeof(arr[1]));  
 //1,取该数组的第二个元素地址,计算大小  
 printf("%d\n",sizeof(&arr));  
 //4,取该数组首元素的地址,计算大小  
 printf("%d\n",sizeof(&arr+1));  
 //4,取数组arr[]下一个数组地址大小  
 printf("%d\n",sizeof(&arr[0]+1));  
    //4,取数组第二个元素地址,计算大小  
 printf("%d\n",strlen(arr));  
 //6,取数组中的字符串长度,以'\0'结束  
 printf("%d\n",strlen(arr+0));  
 //6,从第一个字符开始取计算字符串长度,以'\0'结束  
 printf("%d\n",strlen(*arr));  
 //运行错误 *arr表示首元素,即'a',就是从地址值为97开始找,但97是一个未知地址,访问的参数不同  
 printf("%d\n",strlen(arr[1]));  
 //运行错误 取arr的第二个元素,原因同上  
 printf("%d\n",strlen(&arr));  
 //6,从数组的首元素地址开是计算字符串长度,以'\0'结束  
 printf("%d\n",strlen(&arr+1)):  
 //随机值,跳过数组arr地址,一直寻找下去  
 printf("%d\n",strlen(&arr[0]+1));  
 //5,跳过首元素地址一直寻找下去  
return 0;  
}  
#include<stdio.h>  
#include<string.h>  
int maim()  
{  
    char *p="abcdef";  
    printf("%d\n",sizeof(p));  
    //4,取p的首元素第地址,计算大小  
    printf("%d\n",sizeof(p+1));  
    //4,取p的第二个元素地址,计算大小  
    printf("%d\n",sizeof(*p));  
    //1,使用解引用,相当于取p的首元素计算大小  
    printf("%d\n",sizeof(p[0]));  
    //1,取p的首元素地址,计算大小  
    printf("%d\n",sizeof(&p));  
    //4,取指针变量p的地址,计算大小  
    printf("%d\n",sizeof(&p+1));  
    //4,char * *pp=&p二级指针,加1跳过一个char *变量,而char *大小为四个字节  
    printf("%d\n",sizeof(&p[0]+1));  
    //4,取'b'的地址,计算大小  
  
    printf("%d\n",strlen(p));  
    //6,从'a'的地址开始寻找'\0'结束符  
    printf("%d\n",strlen(p+1));  
    //5,从'b'的地址开始寻找'\0'结束符  
    printf("%d\n",strlen(*p));  
    //运行错误,*p表示首元素,即'a',就是从地址值为97开始找,但97是一个未知地址,访问的参数不同  
    printf("%d\n",strlen(p[0]));  
    //运行错误,上同  
    printf("%d\n",strlen(&p));  
    //随机值,从p的首元素地址开始寻找'\0'结束符  
    printf("%d\n",strlen(&p+1));  
    //随机值  
    printf("%d\n",strlen(&p[0]+1));  
    //5,从第二个元素地址开始寻找'\0'结束符  
    return 0;  
}  
二维数组
#include<stdio.h>  
int main()  
{  
 int a[3][4]={0};  
 printf("%d\n",sizeof(a));  
 //48,数组中12个元素地址,48个字节  
 printf("%d\n",sizeof(a[0][0]));  
 //4,数组第一个元素地址的大小  
 printf("%d\n",sizeof(a[0]));  
 //16,数组第一行所有元素地址的大小  
 printf("%d\n",sizeof(a[0]+1));  
 //4,数组第一行地址名降级成首元素地址,为第一行首元素地址+1,第一行第二个元素  
 printf("%d\n",sizeof(a+1));  
 //4,数组a第二行的地址  
 printf("%d\n",sizeof(&a[0]+1));  
 //4,数组a第二行的地址,取第一行的地址+1  
 printf("%d\n",sizeof(*a));//sizeof(*(a+0))  
    //16,第一行的地址解引用,第一行元素地址  
 printf("%d\n",sizeof(a[3]));  
 //16,数组第四行的地址大小,不需要访问,只计算大小  
 return 0;  
}  







关于数组操作的常见题型

一、数组操作 缺陷:创建数组时,必须指定数组的容量大小,然后根据数据大小分配内存。所以空间效率不高,经常会有空闲的区域未得到充分利用。 优点:可在O(1)时间内读/写任何元素,利用数组来实现哈希表 二...
  • u010796790
  • u010796790
  • 2016-07-19 15:24:13
  • 1264

算法入门经典第二版 第三章数组和字符串 习题参考答案

原文地址:http://www.2cto.com/kf/201408/322120.html 1 序 系统的整理下第三章的学习笔记。例题代码是在未看书本方法前自己尝试并AC的代码,不一定比书上...
  • qq_19427739
  • qq_19427739
  • 2015-02-01 22:18:28
  • 995

c语言 --关于数组与指针的一些基本运算

一.sizeof()的有关运算1知识:当数组名a单独放在sizeof()内部(即 sizeof(a))时,a表示整个数组;当数组名a单独放在&amp;amp;后面时(即&amp;amp;a),a表示整...
  • xu1105775448
  • xu1105775448
  • 2017-04-20 20:32:16
  • 1680

C语言中将数组内的元素进行运算

之前以为数组可以像普通变量一般直接进行数学运算,然而实际编程后发现如果就像b+=b[1],这样并不能实现数组内的数据进行加减,而是加减数组的地址,当然也可以通过先将数组内的数据取出来再进行运算,但是这...
  • super_marie
  • super_marie
  • 2017-04-27 20:47:08
  • 1130

一篇有关数组的经典文章

  • 2010年07月25日 18:33
  • 909KB
  • 下载

java初学之函数的基本知识和数组的基本知识

1.break和continue的区别 break是跳出循环,而continue是跳出本次循环直接进行下次循环 例如:for (int i = 0; i < 5; i++) { ...
  • HKDxiaofan
  • HKDxiaofan
  • 2017-11-30 20:56:39
  • 71

MATLAB加快程序运行的方法:逻辑数组与向量化

一、向量化的介绍用for循环和向量计算是非常常见的。例如,下面的代码片段用for循环计算1到100之间的所有整数的平方,平方根,立方根。for ii=1:100 square(ii)=ii^2...
  • aisikaov5
  • aisikaov5
  • 2016-01-11 21:15:23
  • 1369

有关数组基本知识的阐述

  • 2009年07月11日 17:22
  • 19KB
  • 下载

matlab 学习之数组运算

数组的运算分为矩阵运算和数组运算两类。 1.4.1矩阵运算 矩阵运算包括矩阵的加、减、乘、除和乘方。 矩阵的加、减和乘法: %矩阵的加法 ...
  • gusgao
  • gusgao
  • 2016-12-20 21:25:33
  • 862

NOC与主控板断开,数组、数组运算,字符串

  • 2010年10月10日 09:40
  • 5KB
  • 下载
收藏助手
不良信息举报
您举报文章:编程小常识:数组的基本知识和有关数组的运算
举报原因:
原因补充:

(最多只允许输入30个字)