① 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 ++
}
}