c指针访问数组元素
㈠ c语言中用指针变量指向数组元素
main()
{int
a[10];
//定陵前义数组a为整型
int
*p=a,i;
//p指向尺弊清a的地址,即a[0]的卜晌地址
for(i=0;i<10;i++)
scanf("%d",&a[i]);
//给数组a赋值
printf("\n");
for(p-a;p<(a+10);p++)
//输出数组元素
printf("%d",*p);
//p++表示p指向数组中下一个元素的地址
}
暂时先写这么多,你一开始没给p赋值是不对的~
㈡ c语言怎么调用数组
c语言可以用数组元素的方法或指针的方法调用数组。
int a[100],i;
for(i=0;i<100;i++)
scanf("%d",&a[i]);
for(i=0;i<100;i++)
printf("%d ",a[i]);
也可以:
int a[100],*p;
for(p=a;p<a+100;p++)
scanf("%d",p);
for(p=a;p<a+100;p++)
printf("%d ",*p);
㈢ c语言中用指针和用下标访问数组元素的本质区别
两者意思一样,但是编译器处理起来不见得一样。就像楼上的例子a[2]跟*(a+2)是一个意思。但是对于编译器来说a[2]是一种固定的写法,因此对于地址偏移什么的有固定的处理方式,而*(a+2)在语法上应当分解为先算a+2再取值,如果编译器不优化,完全按照这种定义去编译的话,那么就会有先算出a+2这个地址这一步,因此效率要低些。至于编译优化能不能使两者一致,那就很难说了。
比如我编了这样一个程序
int
a[100];
int
b;
int
i,j,k;
for(i=0;i<1000000;i++){
for(j=0;j<100;j++){
for(k=0;k<100;k++){
b=a[0];
}
}
}
和把b=a[0]换成b=*(a)所耗时间一样。而分别换成b=a[k]和b=*(a+k)后者所耗时间明显增加很多,前者也有所增加,但比较少。编译器优化不能用这个语句测试,因为整个会被优化掉。
㈣ c语言指针指向数组的问题。
首先你要明白一点,数组名和指针本质上是一回事,都是地址,该数组的首地址。知道这一点后就可以活学活用了。这是c语言的精髓。
比如你定义了int
*p,a[10];并且让p=a;,
这个操作叫做指针p指向了数组a,其本质是给p这个变量付了一个值,就是数组a的地址,也是a[0]的地址,也是a本身里面存储的内容。
那么要引用a[i],你可以有很多种写法,比如*(a+i),
*(p+i),
p[i],都是等效的。
p++的含义其实不是p=p+1,至少有时不是,p++的操作其实是让p指向下一个元素,也就是原来p指向的是a[0],那么现在p指向a[1]了。由于a是int类型,站4个字节,那么p++这个操作其实是让p的内容增加了4。不要问为什么,c语言就是这么规定的。如果p指向的是一个char类型,那么p++就使p的值增加1。
㈤ c语言指针引用数组元素,从p=a开始解释下此程序
1. p=a; //使int*指针p指向数组a的首元素,即a[0]的地址—&a[0]。
2. 第一个for循环语句,就是通过指针p来对数组a的各个元素赋初值,*p的意思就是获取指针p所指向的内存单元的值,初始就是对a[0]赋初值i,*p++=i,等价于:
*p=i; //对p指向的当前数组元素赋值,等价于a[i]=i;
p++; //指针p自增1,使指针p指向下一个数组元素
当初始化数组a完成后,
3. p=a; //使指针p重新指向数组a的首元素,即指向a[0]。
4. 第二个for循环,就是通过指针p输出数组a的所有元素到屏幕上了。
总结,通过指针来操作对象,是一种间接访问变量的方式,有很多的好处,这在以后的编程学习中你会慢慢体会到指针的妙处和精髓。
㈥ 在C语言中,用下标如何访问数组元素
.以下标引用的方式访问数组
在使用数组的场合中,我们常见的一种访问方法是使用下标访问数组元素,如:array[2] = 1,此语句是将该数组的第三个元素赋值为1.[ ]符号中的数字可以认为是在数组基地址上的偏移量,可以通过改变这个偏移量来访问整个数组。
2.以指针访问的方式访问数组
除了使用偏移量的方法,我们还可以使用指针的方法来访问数组,即间接引用的方式。如:*(array+2) = 1,同上面的代码一样,也是对该数组的第三个元素进行赋值。
3.下标引用和指针访问的执行效率问题
对于这两灶蚂种不同的访问数组的方式,它们的执行效率也不同,在这里先给出结论:指针访问的效率 >= 下标引用的效率。接下来我们来说说,为什么使用指针进行间接访问的效率会优于小标引用的效率。
下标引用的效率
现在假设有如下代码,执行对整个数组的初始化过程:
int array[10];
for(int i = 0;i < 10;i++)
{
array[i] = 0;
}
在这里我们还是假设编译器中int类型占4个字节,在执行array[i] = 0时,编译器会将其转化为类似*(array + (i*4)) = 0形式。在整个执行10次的循环中,意味着也进行了10次乘法运算操作和10次加法运算操作。李腔
指针访问的效率
假设有如下代码,执行对整个数组的初始化过程:
int array[10];
for(int *ptr = array; ptr < array+10; ptr++)
{
*ptr = 0;
}
这里是将指针一开始指向数组首地址,然后每次向后移动一个数组元素,这里是每次移动4个字节,即每次对指针地址+4。在整个过程中只进行了10次加法运算。同上对比可得,对于数组操作来说,指针访问的效率是优于下标引用的。
4.下标引用和指针访问的优先级问题
关于这个问题,笔者还是先给出结论,再举例进行阐述。
结论:下标引用优先级 > 指针访问优先级。
假设我们现在有以下两隐扰埋个数组的声明:
int *array1[10];
int (*array2)[10];
关于上述声明,乍一看很容易混淆,但其实这只是一个关于结合优先级的问题。在看这些声明时,需要记住下标优先级高于指针*,并且如果出现了( ),那么它的优先级一定是最高的。
int *array1[10]
在*和[ ]同时出现的时候,我们先结合优先级高的[ ]来看,即它先声明了一个含有10个元素的数组array1,然后将剩下的int *组合,可以知道这个数组里面的每个元素,都是一个指向整型类型的指针变量。也就是说,这是一个含有10个指针变量的指针数组。
int (*array2)[10]
这里的声明中出现了( ),由于( )的优先级最高,所以我们先看(*array2),即array2是一个指向某种类型的指针变量。再结合剩下的int [10],可以知道这个指针变量指向的数据类型是含有10个元素的整型数组。也就是说,这是一个数组指针,指向一个10元素整型数组。
㈦ C语言 通过指针变量p访问数组元素array[i][j]的格式: *(p+(i*每行列数+j)
*(p+(i*每行列数+j))就是 array[i][j];
假设梁衡裂定义array时的长度为[10][20];
则每行列数就是20.
p=&array[0][0];的时候。
*(p+x)就是数组array中第x个字橡闭节。
x=i*20+j;
对应的拦缺array[1][2] 等效于 *(p+(1*20+2)) 或 *(p+22)
㈧ c语言中如何用指针指向二维数组中的某个元素
二维数组名a是一个指向指针的指针。也是一个指针数组名,它含3个元素,a[0]a[1],a[2]。虽然a存储的地址是该数组首元素的地址,但它指向的并不是一个变量,而是一个指针。应为a是一个指向指针拆槐的指针,它指向的是和自己存储的地址相同的指针,即a[0],a[0]是第一行一维数组的指针,可以指向具体变量。
这下明白了吧,*(a+0)它不是变量,她是中御慎卖敬指针,a指向a[0],*(a+0)就是a[0].
㈨ c语言使用指针p,访问数组a[5]={1,2,3,4,5}的值。
1.代码如亏旅下:
#include<stdio.h>
intmain(){
inta[5]={1,2,3,4,5};
int*p=a;
printf("访问数组a的值: ");
for(inti=0;i<5;i++)
printf("%d ",*p++);
拆空行getchar();
旅哗return0;
}
2.运行结果如下:
希望对你有帮助~
㈩ C语言中为什么要使用指针访问数组元素
用指针有一些好处:可以再闷颂指针上直接进行计算 比如加减指针。
另外当数组作为参数传递到函数中的时候,用指针是很方便的。
其实数组的名字就是一个指针。游拍
有一本经典的书 《C专家蚂磨郑编程》 可以帮助理解这个问题。这种基础问题是非常重要的。