基礎7---關於指針

c語言提供的指針能夠對內存直接進行操作,就像另一種操作位運算一樣,可以大大提高程序的運行效率。現在歸納總結幾點以便日後看。

1.指針是用來存放對象地址的變量,而地址是指針常量,不能進行賦值等對於變量的運算。

eg.使用指針方式將兩個數按先小後大的順序輸出


#include <stdio.h>
int main()
{
    int a, b,*p1, *p2, *p;
    p1 = &a, p2 = &b;
    scanf("%d%d",&a, &b);
    if(*p1>*p2)
    {
        p= p1;
        p1= p2;
        p2 = p;
    }
    printf("a=%d b=%d\n",a, b);
    printf("Min is:%d   Max is:%d\n",*p1, *p2);
    return 0;
}


2.關於指針的運算

int a=100,*p=&a;

①(*p)++:等價於a++,運算執行後p值不變;

②*p++:按照運算符優先級,等價於*(p++),運算後表達式的值爲a,p指向下一個int型內存單元:

③*++p:按照運算符優先級,等價於*(++p),p先指向下一個int型單元,表達式再引用這個內存單元的值;

④兩指針的相減運算:設p1, p2是同一個指向類型的兩個指針(常量或變量),則p2-p1的結果爲兩個指針之間對象的個數;



3.指針與一維數組:

eg.用多種方法遍歷一維數組元素

這是地址引用法

#include <stdio.h>
int main()
{
    int a[10], i;
    for(i=0;i<10;i++)
        scanf("%d",a+i);
     for(i=0;i<10;i++)
        printf("%d ",*(a+i));
     return 0;
}

下面通過指向數組的指針變量簡介訪問元素


#include <stdio.h>
int main()
{
    int a[10], *p;
    for(p=a;p<a+10;p++)
        scanf("%d",p);
    for(p=a;p<a+10;p++)
        printf("%d ",*p);
    return 0;
}

後者比前者方法快,因爲指針變量直接指向數組元素,不必每次重新計算元素地址。類似於p++的自增運算快於加法運算,大大提高了數組元素的訪問效率。



4.指向多維數組元素的指針。

本質上,c語言將多維數組當成一維數組來處理。

1>地址辨析

在二維數組a[i][j]中,a[i]和*(a + i)是等價的,代表第i行元素的首地址;

&a[i]和a+i是等價的,代表第i行的地址;

a[i] 和*(a + i)不一定是元素,這個結論可推廣到N爲數組的情況。

2> int a[N][M], *p = &a[0][0]

訪問一個二維數組元素a[i][j],可以用:

①數組下標法 a[i][j];

②指針下標法 p[i*M+j];

③地址引用法 *(*(a+i)+j)或*(a[i] + j)

④指針引用法  *(p +i*M+j);


eg.通過指針遍歷二維數組


#include <stdio.h>
int main()
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12},*p;
    for(p =a[0];p<a[0]+12;p++)
        {
        printf("%2d ",*p);
        if((p-a[0])%4== 3)
        printf("\n");//每行輸出四個元素後換行
        }
     return 0;
}



5.數組指針:C語言可以定義一個指針變量,其指向類型是一個數組,稱爲數組指針。


聲明如下:

int a[3][4], (*p2)[4];

p2=a;//p2指向一個有四個整型元素的一維數組。


eg.通過指向一維數組的指針遍歷二維數組的值


#include <stdio.h>
int main()
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int (*p)[4]=a;
    for(int i=0;i<3;i++)
        {for(int j=0;j<4;j++)
        printf("%2d",p[i][j]);
        printf("\n");}

     return 0;
}


6.指向字符數串組的指針

1>%s輸出時參數必須爲字符串地址。

2>使用字符指針數組,各個字符串按實際長度存儲,指針數組元素只是各個字符串的首地址,不存在浪費內存單元問題。



給定一個整數num,( 1<=num<=3999),將整數轉換成羅馬數字。

如1,2,3,4,5對應的羅馬數字分別位I,II,III,IV,V等。

格式:

   第一行輸入一個整數,接下來輸出對應的羅馬數字。

提示:

   羅馬數字的常識見此鏈接,對做題有幫助哦~尤其是表示方法。

http://baike.baidu.com/link?url=injU8M4bAoc2zRZQ1GtgrfvuzCJO9PLnq6fpQGJLenakbzo-rS8p-qsYHR_81-aN


樣例輸入

123

樣例輸出

CXXIII




#include <stdio.h>
void trans_toRoman(int num)
{
     char *roman[][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",
        "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
        "","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
        "","M","MM","MMM"};
    int i=10000,j=0,n;
    for(j=0;j<4;j++)
       {
        n=(num%i)/(i/10);
        i/=10;
        printf("%s",roman[3-j][n]);
       }
    printf("\n");
}
int main()
{
    int n;
    char* roman;
    scanf("%d", &n);
    if(n < 1 || n > 3999)
    {
       printf("ERROR NUMBER!\n");
    }
    trans_toRoman(n);
    return 0;
}



②給出一個數字,打出相應星期的英文






#include<stdio.h>
char *day_name(int n){
	char *name[]={ "Illegal day",
                    "Monday",
                    "Tuesday",
                    "Wednesday",
                    "Thursday",
                    "Friday",
                    "Saturday",
                    "Sunday"};
	return ((n<1||n>7) ? name[0] : name[n]);
}

int main(){
	int i;
	scanf("%d",&i);
	printf("Day No:%2d-->%s\n",i,day_name(i));
	return 0;
}

 


先到這裏,指針的東西還很多,日後再續!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章