① c语言下标法和指针法调用数组
1.p[i]好一些
2.如果是一般类型比较小的,比如int p[10], char p[10]这个用指针和用数组没啥区别
但是如果是一个大型的结构体,比如
struct str
{
int a[1000],
char b[100],
}p[10];
这个结构体的大小为4100
这个时候,假设i = 2
*(p + i )就相当于*(p + 2),相当于p夸了2个单位的结构体大小(4100)才指到p的第二个位置,然后才取值
而p[2]就直接可以取到第二个结构体的值了
3,第二种方法效率高一些,原因如第二个
4,这个我也说不好。你做多了C的东西自然而然就知道了
② C语言下标和指针的关系
指针与数组是C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之间的联系及在编程中的应用。
1.指针与数组的关系
当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如:
char str[20], *ptr;
ptr=str;
ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址。此时可以认为指针ptr就是数组str(反之不成立),这样原来对数组的处理都可以用指针来实现。如对数组元素的访问,既可以用下标变量访问,也可以用指针访问。
2.指向数组元素的指针
若有如下定义:
int a[10], *pa;
pa=a;
则p=&a[0]是将数组第1个元素的地址赋给了指针变量p。
实际上,C语言中数组名就是数组的首地址,所以第一个元素的地址可以用两种方法获得:p=&a[0]或p=a。
这两种方法在形式上相像,其区别在于:pa是指针变量,a是数组名。值得注意的是:pa是一个可以变化的指针变量,而a是一个常数。因为数组一经被说明,数组的地址也就是固定的,因此a是不能变化的,不允许使用a++、++a或语句a+=10,而pa++、++pa、pa+=10则是正确的。由此可见,此时指针与数组融为一体。
3.指针与一维数组
理解指针与一维数组的关系,首先要了解在编译系统中,一维数组的存储组织形式和对数组元素的访问方法。
一维数组是一个线形表,它被存放在一片连续的内存单元中。C语言对数组的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进行访问。通常把数据类型所占单元的字节个数称为扩大因子。
实际上编译系统将数组元素的形式a[i]转换成*(a+i),然后才进行运算。对于一般数组元素的形式:<数组名>[<下标表达式>],编译程序将其转换成:*(<数组名>+<下标表达式>),其中下标表达式为:下标表达式*扩大因子。整个式子计算结果是一个内存地址,最后的结果为:*<地址>=<地址所对应单元的地址的内容>。由此可见,C语言对数组的处理,实际上是转换成指针地址的运算。
数组与指针暗中结合在一起。因此,任何能由下标完成的操作,都可以用指针来实现,一个不带下标的数组名就是一个指向该数组的指针。
4.指针与多维数组
用指针变量可以指向一维数组,也可以指向多维数组。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。
例如,在一个三维数组中,引用元素c[i][j][k]的地址计算最终将换成:*(*(*(c+i)+j)+k)。了解了多维数组的存储形式和访问多维数组元素的内部转换公式后,再看当一个指针变量指向多维数组及其元素的情况。
1 指向数组元素的指针变量
若有如下说明:
int a[3][4];
int *p;
p=a;
p是指向整型变量的指针;p=a使p指向整型二维数组a的首地址。
*(*(p+1)+2)表示取a[1][2]的内容;*p表示取a[0][1]的内容,因为p是指向整型变量的指针;p++表示p的内容加1,即p中存放的地址增加一个整型量的字节数2,从而使p指向下一个整型量a[0][1]。
2 指向由j个整数组成的一维数组的指针变量
当指针变量p不是指向整型变量,而是指向一个包含j个元素的一维数组。如果p=a[0],则p++不是指向a[0][1],而是指向a[1]。这时p的增值以一维数组的长度为单位。
5.指针与字符数组
C语言中许多字符串操作都是由指向字符数组的指针及指针的运算来实现的。因为对于字符串来说,一般都是严格的顺序存取方式,使用指针可以打破这种存取方式,更为灵活地处理字符串。
另外由于字符串以′\0′作为结束符,而′\0′的ASCII码是0,它正好是C语言的逻辑假值,所以可以直接用它作为判断字符串结束的条件,而不需要用字符串的长度来判断。C语言中类似的字符串处理函数都是用指针来完成,使程序运行速度更快、效率更高,而且更易于理解。
③ C语言数组下标和指针的关系
类型标识符 * 变量名eg:char * Pointer性质数组名是一个常量,不能进行自增等运算. eg: Data++; X 指针是一个变量,能进行自增等运算. eg: Pointer++; √引用数组利用下标引用数组中的数据eg: a = Data[5]; 指针利用取值运算符引用所指向的数据eg: a = *Pointer;其它 联系:当我们将一个指针指向一个数组后,指针后数组就有许多相同的地方了.如果在程序中使用了Pointer = Data;(将指针指向数组).此时对数组的引用就可以使用指针变量了.具体如下:Pointer[i]表示*(Pointer+i),即通过带下标的指针引用数组元素 Pointer+i,Data+i; 表示Data[i]的地址,指向数组第i个元素 *(Pointer+i) ,*(Data+i) 表示Pointer+i和Data+i所指向的内容,即Data[i]
④ c语言利用指针代替下标进行数组编程
#include<stdio.h>
int main()
{ int a[6],*p;
for(p=a;p<a+6;p++)
scanf("%d",p);
for(p=a;p<a+5;p++)
*p-=*(a+5);
for(p=a;p<a+6;p++)
printf("%d ",*p);
return 0;
}
⑤ C语言数组的下标
c语言中的下标是定义数组a[]和数组b[n],下标是用在数组中的;
a[1]和b[1]就是下标相同的一个元素,数组a[1]中的数满足条件的之后就做移位计算,是减小左移,右移增加;
例:
inta[5]={1,2,3,4,5};
printf(“%d,%d,%d,%d,%d”,a[0],a[1],a[2],a[3],a[4]);//会输出1,2,3,4,5
a[0]=10;
printf(“%d”,a[0]);//输出10;
(5)下标指针c语言扩展阅读
基本的算数运算符
(1)、+加法运算或正值运算符
4+4、+5
(2)、-减法运算或负值运算符
6-4、-10、-29
(3)、乘法运算
注意符号,不是x,而是;
(4)、/除法运算
注意符号,不是÷,也不是,而是/;
整数除于整数,还是整数。1/2的值是0,这个并不是二分之一,不会四舍五入,直接截断取值;
(5)、%取余运算
取余:即两个整数相除之后的余数;
注意:%两侧只能是整数,正负性取决于%左侧的数值;
⑥ C语言下标要求数组或指针类型啥意思怎么改啊。
“error C2109: 下标要求数组或指针类型”这个错误已经说的很清楚了;
说明程序出错的那行,应该是数组或者指针类型,才能有下标 ;
正确使用参考实例如下:
数组是int a[]或者int* a,这样改:
#include<stdio.h>
void fun(int a[],int n,int *odd,int *even)
{
int i;
*odd=0;
*even=0;
for (i=0;i<n;i++)
{
if(a[i]%2==0)
*even+=a[i];
else
*odd+=a[i];
}
}
void main()
{
int a[5]={1,2,3,4,5},j,o;
fun (a,5,&j,&o);
printf("the sum of odd is %d,tne sun of even is %d",j,o);
}
⑦ C语言 指针方法
#include<stdio.h>
int main()
{
int a,b,c,s[3],t;
int *x,*y,*z;//定义指针变量
x=&a;//将a的地址赋给指针x,下同
y=&b;
z=&c;
scanf("%d%d%d",x,y,z);
s[0]=*x;//将指针x所指向的变量值赋给数组s的第一个元素;依次类推
s[1]=*y;
s[2]=*z;
for(int i=0;i<3;i++)//冒泡排序
for(int j=0;j<3-i-1;j++)
if(s[j]<s[j+1])
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
for(int i=0;i<3;i++)
printf("%d ",s[i]);
return 0;
}
⑧ 用C语言将一个数字字符串转换为整数(下标和指针两种方式)
下标方式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(void)
{
unsigned char test[5] = "12345";
int cnt;
/*字符'0'-'9'对应assiic表的数字是0x30-0x39*/
for(cnt=0; cnt < strlen(test); cnt ++)
printf("%d", test[cnt] - '0'); /*字符'n'('0'<=n<='9')-'0'即等于数字n*/
printf("\n");
}
指针方式
void main(void)
{
unsigned char *point = "12345";
while(*point)
{
printf("%d", *point - 0x30); /*理由同上,字符'0'即十六进制数字0x30*/
point ++
}
}