精华内容
下载资源
问答
  • 总结文档的时候遇到了这个问题。...博客作者说怀疑指针法查找元素比下标法更高效不一定正确,并且说当使用指针访问数组元素(注意是新创建一个指针指向数组名)要慢于通过数组下标访问。 这个说法是正确的,...

    总结文档的时候遇到了这个问题。在CSDN上看到一篇博客觉得有缺漏和误导性,所以自己总结一下。

    原参考博客:

    https://blog.csdn.net/qq_20583039/article/details/47000985

     

    博客作者说怀疑指针法查找元素比下标法更高效不一定正确,并且说当使用指针访问数组元素(注意是新创建一个指针指向数组名)要慢于通过数组下标访问。

    这个说法是正确的,但并不是原文想要表达的思想。

     

    原文是想要说明通过数组名做为指针完成对数组的遍历操作要比通过下标法完成数组遍历更加的快速高效。

    原因是通过下标法每次编译器都需要重新计算下标所指向的地址。假设有100个数的数组,那么他要进行100次乘法运算。每次乘法运算对应的汇编代码要对寄存器进行一次操作。之后再和数组首地址相加。

    而通过指针法遍历,每次都是固定的1*4(这里假设为4个字节的int型),也就是说编译器只需要计算一次乘法运算之后每次都是固定的1*4(也就是可以直接调用),之后再和数组首地址相加。

     

    这样子看就可以明确的表明是指针法更加的高效。

    代码示例

    int array[10],a;
    for(a = 0;a <10 ;a++)
    {
    array[a] = 0;
    }
    /*下标法方式遍历赋值为了对下标求值,编译器在程序中插入指令,取a的值并把它与整型的长度(也就是4)相乘,这个乘法需要花费一定的时间和空间。
    和*/
    int array[10],*ap;
    for(ap = array ; ap < array + 10;ap++)
    {
    *ap = 0;
    }/*指针法方式遍历赋值,虽然不需要下标但是也需要进行乘法运算,但是乘法运算出现在for语句的调整部分,1这个值必须和整型长度相乘,然后再和指针相加,但是这里有一个重大的区别:循环每次执行时,执行乘法运算的部分都是两个相同的数(1和4)结果,这个乘法只在编译时执行一次——程序现在包含了一条指令,把4和指针相加。程序运行时并不执行乘法运算。*/
    

    这里可以使用极限思想,为一个非常大数组遍历赋值,就可以清楚地看到两者所需时间的不同。

    展开全文
  • #include<stdio.h> int main() { int arr[5] = { 11,12,13,14,15 }; int i, * p; printf("下标法:\n"); for (i = 0; i < 10; i++) printf("arr[%d]=%d ", i,arr[i]); print...
    #include<stdio.h>
    int main()
    {
        int arr[5] = { 11,12,13,14,15 };
        int i, * p;
        printf("下标法:\n");
        for (i = 0; i < 10; i++)
            printf("arr[%d]=%d ", i,arr[i]);
        printf("\n 地址法:\n");
        for (i = 0; i < 10; i++)
            printf("arr[%d]=%d ", i, *(arr+i));
        printf("\n 指针法:\n");
        for (p=arr,i = 0; i < 10; i++)
            printf("arr[%d]=%d ", i, *(p+i));
        return 0;
    }

       

    展开全文
  • L1-27 出租(下标法

    2018-03-05 20:25:40
    L1-27 出租(下标法)下面是新浪微博上曾经很火的一张图:一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]...

    L1-27 出租(下标法)

    下面是新浪微博上曾经很火的一张图:

    一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。

    本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

    输入格式:

    输入在一行中给出一个由11位数字组成的手机号码。

    输出格式:

    为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

    输入样例:
    18013820100
    
    输出样例:
    int[] arr = new int[]{8,3,2,1,0};
    int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int arr[50];
    bool cmp(int a,int b)
    {
    return a>b;
    }
    int search(int x,int len)
    {
    int i;
    for(i=0;i<len;i++)
    {
    if(x-48==arr[i])
    return i;
    }
    }
    int main()
    {
    char tel[20];
    char index[50];
    int cnt[50]={0};
    scanf("%s",tel);
    int i,len;
    for(i=0;i<11;i++)
    cnt[tel[i]-48]=1; //下标法 
    int j=0;
    for(i=0;i<11;i++)
    {
    if(cnt[i]!=0)
    {
    arr[j]=i;
    j++;
    }
    }
    len=j;                    //所以要记录长度 
    sort(arr,arr+j,cmp);    //arr不能是字符数组,不然0,就输出不了了 
    for(i=0;i<11;i++)
    index[i]=search(tel[i],len);
    printf("int[] arr = new int[]{");
    for(i=0;i<len-1;i++)
    printf("%d,",arr[i]);
    printf("%d};\n",arr[i]);
    printf("int[] index = new int[]{");
    for(i=0;i<10;i++)
    printf("%d,",index[i]);
    printf("%d};\n",index[i]);
    return 0;

    展开全文
  • 最小下标法排序

    2019-09-12 10:09:11
    int[] a={9,5,12,3,8,18,7,1,2,35,6}; for (int i = 0;... //假定index时最小下标 int index=i; for(int j=i+1;j<a.length;j++){ if(a[index]>a[j]){ index=j;//始终让index...
    int[] a={9,5,12,3,8,18,7,1,2,35,6};
    		for (int i = 0; i < a.length-1; i++) {
    			//假定index时最小下标
    			int index=i;
    			for(int j=i+1;j<a.length;j++){
    				if(a[index]>a[j]){
    					index=j;//始终让index下标的值最小,此时index=j
    				}
    			}
    			int item=a[i];//将最大值给item,然后互换位置,循环遍历
    			a[i]=a[index];
    			a[index]=item;
    		}
    		System.out.println(Arrays.toString(a));
    //		最小下标法就是每次拿第一个和后面的去进行比较,如果比后面的大,就互换位置,然后继续之前的操作
    

    输出结果:
    [1, 2, 3, 5, 6, 7, 8, 9, 12, 18, 35]
    附带冒泡排序一个:

    int[] a={9,5,12,3,8,18,7,1,2,35,6};
    		for (int i = 0; i < a.length-1; i++) {
    			for(int j=0;j<a.length-i-1;j++){
    				if(a[j]>a[j+1]){
    					int item=a[j];
    					a[j]=a[j+1];
    					a[j+1]=item;
    				}
    			}
    		}
    		System.out.println(Arrays.toString(a));
    
    展开全文
  • L1-020 帅到没朋友(下标法)当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。输入格式:输入第一行给出一个正整数N(&lt;=100),是已知朋友圈的...
  • 数组的指针法和下标法

    千次阅读 2018-03-01 21:56:53
    // #include "stdafx.h" #include &lt;stdio.h&gt; int main(int argc, char* argv[]) { /* int a[10] = {1,2,3,4,5,6,7,8,9,10}; int i = 0; while(i&...a[%d]=%-8d 地...
  • #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSArray *arr=@[@"MON",@"TUE",@"WED"]; //下标遍历 1 for ...
  • C 下标法 首地址法 指针变量法

    千次阅读 2016-08-11 10:18:20
    首先数组的访问有三种形式:1)下标法;2)首地址法;3)指针变量法。这里我们先分析首地址法。 假设有一个二维数组a[3][4],a就是首地址,他是一个指针是一个常量,指向第一个元素的地址,也就是指向第一行的...
  • 下面我们针对一道题目来看一看数组下标法怎样处理字符串。 注意:这个方法比较低效。大家分析一下低效所在,然后试着提出一个改进的方法。 一、题目描述 请把下面的函数补充完整: void func(char *str, char ...
  • 用冒泡排序
  • 在《抛砖引玉-用数组下标法在字符串str的所有ch2字符后添加一个ch3字符》(https://blog.csdn.net/weixin_43917370/article/details/106239521)中,我们留下了一个问题: 该方法涉及到数组的插入,效率较低,能否...
  • 上面的是指针方法,感觉比较复杂,用下标法就清爽很多,代码也更容易阅读: POSITION* CStudent::Sort(FunPointer pFun) { int nCount = GetCount(); pPOS = new POSITION[nCount+1]; POSITION pos = m_list....
  • map 容器中,那么下标操作会插入一个具有该键的新元素。 map  对象中一个给定键只对应一个元素。如果试图插入的元素所对应的键 已在容器中 ,则  insert  将不做任何操作 。含有一个或一对迭代器...
  • 1154: Color the ball Time Limit: 1 Sec Memory Limit: 128 MB Description N个气球排成一排,从左到右依次编号为1,2,3…N....amp;lt;= b),YY便为骑上他的“小飞鸽&...牌电动车从气球a开始到气球b依次给每个气球涂...
  • #include&lt;stdio.h&gt; int main() { int a[10],i,*p; for(i=0;i&lt;10;i++) scanf("%d",&amp;a[i]); for(i=0;i&lt;10;i++) printf("%d "...%d &quo
  • #include "stdafx.h" #include using namespace std; float getAverate(int *p,int allsInfo) {  float num1=0;  for (int i=0;i  {  num1+=*(p+i);  //num1+=p[i];,原理是这样
  • 1155: 春运 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 春运将至,有关部门要统计春运的人流量。现有一辆公交车,共停N(1&...1000000)个车站(车站编号为1,2,3,……)...
  • matlab学习--数组的下标法引用

    万次阅读 2016-10-28 20:15:28
    1.下标法(subscripts) 2.索引法(index) 3.布尔法(Boolean) 在使用这三种方法之前,大家头脑一定要清晰的记住,Matlab中数组元素是按列存储(与Fortran一样),比如说下面的二维数组 A= 8 1 6 3 5 7 ...
  • L1-003 个位数统计给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0&lt;=di&lt;=9, i=0,...,k-1, dk-1&gt;0),请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,...
  • #include void main( ) { int a[5]={23,12,45,33,67},*p=a,i; cout下标方式:"; for (i=0;i;i++) cout[i]; cout; cout指针方式:"; for (p=a;p;p++) cout*p; cout; }对以上
  • 一维数组
  • #include int main(){ char *a="I love China!"; int i; printf("The sixth character is %c/n",a[5]); for(i=0;a[i]!=/0;i++) { printf("%c",a[i]); } system("p
  • 剑指offer面试题51. #include <stdio.h> #include <stdlib.h> int find_dump(int *num, int len, int *dump) { int i; for (i=0; i<len; i++) { if (i + 1 != num[i] &... ...
  • (1)下标方法 (2)列指针方法 (3)行指针方法 */ #include using namespace std; void output_Subscript(int p[][4],int n); void output_Line(int p[][4],int n); void output_Column(int *p,int n);
  • 文章目录 面试题21:调整数组顺序使奇数位于偶数前面 题目描述1:[from leecode] ... (2) 下标法 //利用下标操作符 for(auto i = 0; i (); ++i) cout[i]; cout; (3)利用范围for循环 for(auto i : ivec) cout; cout;
  • #include <stdio.h> int main() { int count = 1; int n = 10 ; int num=n;int i =0; int monkey[300]={0}; for(i=0;i<n;... //数组下标 while(num>1) { if(monkey
  • 数组玩 1 下标移位

    2019-01-30 11:29:43
    数组玩 1 下标移位
  • python列表知道下标怎么取值在python中,如果知道列表下标,可以直接通过下标法(列表名[下标])来在python中,如果知道列表下标,可以直接通过下标法(列表名[下标])来取出该下标对应的列表元素,例如:print(a[0])就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,634
精华内容 1,853
关键字:

下标法