指針

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=012,…………訪問第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;
}
相關文章
相關標籤/搜索