scanf函數數組
使用scanf("%d",&N) 將從用戶的輸入中讀入到變量N的地址中,&是取N的地址。函數
假如沒有了&,也就是是將用戶輸入讀入到變量N的內容所指的地址中,這一個地址多是一個垃圾數,或者你定義的一個整數如100,編譯器須要將用戶輸入存入到內存地址爲100的地址這確定是錯的spa
用scanf函數給數組賦值格式是這樣的指針
for(i=0;i<len;i++) scanf("%d",&a[i])
打印指針變量所指向的內容code
#include <stdio.h> #include <stdlib.h> int main() { printf("Hello world!\n"); int n=1000; int *p=&n; printf("%p\n",p); printf("%p\n",&n); }
指針做爲函數參數blog
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { printf("Hello world!\n"); int n=1000; int *p=&n; p=10; printf("p所指的內存地址%p\n",p); printf("%p\n",&n); p=-10; printf("給指針賦值負數,儘管內存地址沒有負數,當時這樣賦值是沒有問題的\n"); printf("p所指的內存地址%p\n",p); int a=10;int b=20; printf("\n變量a所在的內存地址%p\n",&a); printf("變量b所在的內存地址%p\n",&b); int *p1=&a; //下面語句是直接改變指針的指向,可是編譯器不會報錯 printf("\n賦值前p1所指的內存地址%p\n",p1); p1=10; printf("賦值後p1所指的內存地址%p\n",p1); printf("這裏說明了指針p1做爲一個變量其值是能夠改變的\n"); // 可是要是往這個地址寫東西,編譯會經過當時程序會崩潰 // *p1=100; swap2(&a,&b); printf("a=%d b=%d\n",a,b ); } void swap(int *x,int *y) { //函數定義爲 int*x,也就是說x是一個指針,x的內容就是一個地址 //*x就是x這個地址所存的內容 // 經過gdb> p x 確實看到了 $1 = (int *) 0x28ff00 //> p *x $2 = 10 int temp; temp=*x; *x=*y; *y=temp; } void swap1(int *x,int *y) { // int *Ptemp; //這樣寫編譯器不會報錯,但程序會崩潰,由於使用了沒有指定的指針 //下面的編譯器不會報錯,但程序會崩潰,由於你要往空地址放東西 int *Ptemp=NULL; *Ptemp=*x; *x=*y; *y=*Ptemp; } void swap2(int *x,int *y) { //這個程序不起做用由於這裏只是調轉了xy的指向 //原來x指向a,y指向b 但後來是x指向b,y指向a printf("x指向%d\n",*x ); printf("y指向%d\n",*y ); int *ptemp; ptemp=x; x=y; y=ptemp; printf("x指向%d\n",*x ); printf("y指向%d\n",*y ); }
任何的類型均可以做爲數組或指針的類型 ,如int long float …………內存
特別的當用用數組做爲指針的基類型就是 指向數組的指針編譯器
定義爲 int(*p)[3] ----------首先是p與*結合定義了一個指針,了一個指向int型數組,數組內有三個元素即 int [3]io
<=>指向一個有3個元素的一維數組的指針變量編譯
如今還不知道指向數組的指針的用處
當用指針做爲數組的基類型,就是指針數組,即數組的每個元素的類型都是指針類型。
定義爲 char *p[3]----------由於p首先是與 [3] 結合,成爲一個數組,而後是基類型爲char * 即指針類型
指針與二維數組
用另外一個角度看二維數組
int a[2][3] 當作是一個複合的一維數組,這個數組有兩個元素,每個元素都是 int [3]類型, 銅鼓 a[i] i=0,1,2,…………訪問第i個元素 數組是複合類型,必須轉化爲基本類型才能訪問對應的值 a[i] +j 就是對應的基本類型的地址,也就是第i行,第j列的地址 經過解引用 *(a[i]+j)就可訪問對應元素的值
定義二維數組的指針
int *(p)[3]
#include <stdio.h> #include <stdlib.h> int main() { printf("Hello world!\n"); int count=1,i,j; int a[2][3]; for(i=0;i<2;i++) for(j=0;j<3;j++) { a[i][j]=count; count++; } for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("%d\t",a[i][j]); } printf("\n "); } printf("\n "); printf("\n下面兩個說明用數組名a表示了二維數組的首地址,也就是第0行的地址\n"); printf("二維數組首地址 %p\n",a); printf("二維數組第0行首地址%p\n",a[0]); printf("\n "); printf("\na+i就是指二維數組a的第i行的首地址,要訪問第i行第j列的元素,須要獲得對應的地址爲*(a+i)+j\n"); printf("二維數組第一行第一列地址 %p\n",a[1]+1); printf("二維數組第一行第一列元素 %d\n",*(a[1]+1)); printf("%p\t",*a); printf("%p\t",a[0]); return 0; }