c課堂筆記 day-4

作業(yè)講解:

(1) 將2~100之間的素?cái)?shù) 保存到數(shù)組中,并遍歷輸出,每五行一個(gè)
#include<stdio.h>
#define N 50
int main()
{
int arr[N];

                    int i=2;
                    int j=0;
                    int k=0;
                    for(i=2;i<100;++i)
                    {
                      for(j=2;j<i;j++)
                      {
                  //從2開始遍歷,查找能被i整除的數(shù),
                 //若找到則跳出內(nèi)層循環(huán)
                          if(i%j==0)
                          
                                break;
                       }   
                  //若i==j,則i是素?cái)?shù),否則不是
                         if(i==j)
                          {
                                arr[k]=i;
                                k++;
                                printf("%4d",i);
                                if(k%5==0)
                                printf("\n");
                          }
                      } 
                   

                }

(2) 在一個(gè)升序或降序排列的數(shù)組中,插入一個(gè)元素;提示:數(shù)組元素部分初始化

(按升序或降序)至少空一個(gè)位置存放要插入的數(shù)據(jù)。
插入元素后,仍然是按升序或降序排列
#include<stdio.h>
int main()
{
int arr[5]={10,9,12,8};
int i,j,k,temp;
printf("插入一個(gè)數(shù):\n");
for(i=0;i<5;i++)
if(arr[i]==0)
scanf("%d",&arr[i]);
for(k=0;k<5;k++)
{
for(j=0;j<5;j++)
{
if(arr[k]<arr[j])
{
temp=arr[j];
arr[j]=arr[k];
arr[k]=temp;
}

                  }
            }
            for(i=0;i<5;i++)
            printf("%4d  ",arr[i]);  
        }

(3)互換數(shù)

            #include<stdio.h>
            int main()
            {
                int arr[5];
                int i,temp;
                printf("請(qǐng)輸入五位數(shù):\n");
                for(i=0;i<5;i++)
                scanf("%d",&arr[i]);
                   temp=arr[0];
                   arr[0]=arr[4];
                   arr[4]=temp;
                   
                   temp=arr[1];
                   arr[1]=arr[3];
                   arr[3]=temp;
                   
                for(i=0;i<5;i++)
                printf("%d\n",arr[i]);
                
            } 

一、數(shù)組

1、二維數(shù)組
    行數(shù)可以省略,列不可以省??!
    #include<stdio.h>
    int main()
    {
       //以下初始方法均可
       int arr[][3]={1,2,3,4,5,6,7,8,9};
       //int arr[3][3]={1,2,3,4,5,6,7,8,9};
       //int arr[][3]={1,2,3,4,5};
       //int arr[][3]={0};
       //遍歷輸出二維數(shù)組
       int i=0;
       int j=0;
       for(i=0;i<3;i++)
       {
            for(j=0;j<3;j++)
            {
                arr[i][j]=3*i+1;
                //或者手動(dòng)輸入
                //scanf("%d",arr[i][j]);
            }
             
       }
       
       
       for(i=0;i<3;i++)
       {
            for(j=0;j<3;j++)
            {
            //printf("arr[%d][%d]=%d",i,j,arr[i][j]);
                printf("%4d",arr[i][j]);
            }
             printf("\n");
       }
    }

求二維數(shù)組的總和余平均值

        #include<stdio.h>
        int main()
        {
           int arr[][3]={1,2,3,4,5,6,7,8,9};
           int i,j,sum=0;
           float k=0;
           for(i=0;i<3;i++)
              for(j=0;j<3;j++)
              {
                 sum=sum+arr[i][j];
              }
              k=(float)sum/9;
              printf("sum=%d k=%f\n",sum,k);
            printf("===========================\n");  
           //每行 的總和即平均值
           int sum1=0;
           float k1=0; //平均值
           for(i=0;i<3;i++)
           {
              sum1=0;
              for(j=0;j<3;j++)
              {
                 sum1=sum1+arr[i][j];
              }
              k1=(float)sum1/3;
              printf("sum1=%d k1=%f\n",sum1,k1);
              
            }
            printf("===========================\n"); 
            //每列  的總和即平均值
           int sum2=0;
           float k2=0; //平均值  
           for(i=0;i<3;i++)
           {
              sum2=0;
              for(j=0;j<3;j++)
              {
                 sum2=sum2+arr[j][i];
              }
              k2=(float)sum2/3;
              printf("sum2=%d k2=%f\n",sum2,k2);
            }
              
        }

二、指針

(1) 指針類型是一種特殊類型
三種定義類型:
DataType name;
DataType
name;
DataType * name;
*:是指針的標(biāo)志
name: 變量名
指針和普通變量的區(qū)別:
指針:存地址
普通變量:存值
指針只能保存與其相同類型的地址
int *p; 只能保存int 型地址
char *pc; 只能保存char 型地址
double *pd; 只能保存double 型地址

(2) 指針初始化

int *p=NULL; //ok

int a=3; //ok
int *pa=&a;

int *pb; //ok
pb=&a;

int ****pc; //這種賦值error
*pc=&a;

            #include<stdio.h>
            int main()
            {
                int num=6;
                //NULL是一個(gè)空地址 是一個(gè)宏
                int *pa=NULL;
                
                int *pb=&num; 把num 的地址賦給pb, 
                    *號(hào)是取pb指向地址里面的值
                
                int *pc;
                pc=&num;
                
                int *pb;  //錯(cuò)誤 不能這樣賦值
                *pb=&num;
                
                地址的訪問
                
                //地址
                printf("&num=%p\n",&num);
                printf("pb=%p\n",pb);
                
                //元素的訪問
                printf("num=%d\n",num);
                //*+pb是取地址的值 而pb里面是&num的地址,
                printf("*pb=%d\n",*pb); 
                
            }

(3) 地址的訪問

           int a=10;
           int *pb;
           pb=&a;
           變量名    變量地址   變量值
             a        0x00012    10
             pb       0x00024   0x000012
             
             *pb:取指針對(duì)應(yīng)內(nèi)存里面的值
             可以把指針變量賦值給同類型指針
            #include<stdio.h>
            int main()
            {
               int *p=NULL;
             //  printf("*p=%p\n",p);
               //空地址不能訪問里面的值
      //  printf("*p=%d\n",p);//error內(nèi)存泄漏  核心轉(zhuǎn)儲(chǔ)   
               int a=10;
               int *pa=&a;
               printf("&a=%p\n",&a);
               printf("p=%p\n",p);
               printf("&p=%p",&pa);
               
               
               printf("a=%d\n",a);
               printf("*pa=%d\n",*pa);
            }


            #include<stdio.h>
            int main()
            {
         int *p=10; //error  不能將常量直接賦值給指針變量
               printf("p=%p\n",p);
        printf("*p=%d\n",*p);//內(nèi)存中并未分配0xa這塊內(nèi)存
               
               int a=12;
               int *pa=&a;
               int *pb;
               pb=pa;
               //可以把指針變量賦值給同類型指針
               
               printf("pa=%p\n",pa);
               printf("pb=%p\n",pb);
               printf("*pa=%d\n",*pa);
               printf("*pa=%d\n",*pa);
               
               
     //強(qiáng)制類型轉(zhuǎn)化  臨時(shí)轉(zhuǎn)化 并不改變pa的屬性
               char *pc=(char *)pa;
               printf("*pc=%d\n",*pc);
               
            }

(4) 64位機(jī)下所有指針大小為8 32位機(jī)為4

一般情況寫4
#include<stdio.h>
int main()
{
   printf("sizeof(char *)=%ld\n",sizeof(char *));
   printf("sizeof(short *)=%ld\n",sizeof(short *));   
   printf("sizeof(int *)=%ld\n",sizeof(int *));
   printf("sizeof(long *)=%ld\n",sizeof(long *));
   printf("sizeof(float *)=%ld\n",sizeof(float *));
   printf("sizeof(double *)=%ld\n",sizeof(double *));
}
結(jié)果:
    sizeof(char *)=8
    sizeof(short *)=8
    sizeof(int *)=8
    sizeof(long *)=8
    sizeof(float *)=8
    sizeof(double *)=8

(5) 指針的類型和指針?biāo)赶虻念愋?br> int pa;
double pd;
指針的類型: 是類型+
如 int *
指針?biāo)赶虻念愋?:就是類型 int
一句話就是指針的類型int
指向的是int類型

二、 指針與數(shù)組

       (1)  數(shù)組名是一個(gè)地址
         數(shù)組元素的訪問的方法:
            int arr[5]={1,2,3,4,5};
            int *pa=arr;
            
            arr[0];  arr[3];
            *(arr);  *(arr+3);
            *(pa);   *(pa+3);
            pa[0];   pa[3]; 

            #include<stdio.h>
            int main()
            {
                int arr[5]={1,2,3,4,5};
                //數(shù)組名表示的是一個(gè)地址
                int *pa=arr;
                printf("===========================\n");
                printf("arr=%p\n",arr);
                printf("&arr[0]=%p\n",&arr[0]);
                printf("pa=%p\n",pa);
                printf("===========================\n");
                //地址是一樣的
                printf("arr+1=%p\n",arr+1);
                printf("pa+1=%p\n",pa+1);
                //地址是一樣的
                printf("===========================\n");
                printf("arr+2=%p\n",arr+2);
                printf("pa+2=%p\n",pa+2);
                //地址里面的值是一樣的
                printf("===========================\n");
                printf("*(arr+2)=%d\n",*(arr+2));
                printf("*(pa+2)=%d\n",*(pa+2));
            }    
           
           
            #include<stdio.h>
            int main()
            {
                int arr[5]={1,2,3,4,5};
                //數(shù)組名表示的是一個(gè)地址

                int *pa=arr;
                 //數(shù)組元素的訪問
                printf("arr[0]=%d\n",arr[0]);
                //指針對(duì)數(shù)組元素的訪問
                printf("pa[0]=%d\n",pa[0]);
                
                printf("arr[4]=%d\n",arr[4]);
                printf("pa[4]=%d\n",pa[4]);
               
            }


            #include<stdio.h>
            int main()
            {
                char arr[16]={"hello,shanghai!"};
                //數(shù)組名表示的是一個(gè)地址
                char *pc = arr;
                
                for(pc=arr;pc<arr+16;pc++)
                {
                    if(*pc>='a' && *pc<='z')
                         *pc -= 32;
                 }
                 pc=arr;
                printf("%s\n",pc);
                 
            } 

(2) 野指針

           沒有初始化,或者其指向的內(nèi)存被釋放,
           而指針沒有被置空
           
           危害:造成系統(tǒng)資源的浪費(fèi),容易造成未知的致命錯(cuò)誤
            #include<stdio.h>
            int main()
            {
                int num = 10;
                int *pa = &num;
                printf("*pa=%d\n",*pa);
                
                
                int *pb;
                //error ,未經(jīng)初始化而使用,容易出現(xiàn)段錯(cuò)誤
                printf("*pb = %d\n",*pb);
                
            }

(3) 指針地址的運(yùn)算

            指針的自增和自減
            自增:指針指向高地址方向
            自減:指針指向低地值方向
            #include<stdio.h>
            int main()
            {
                int arr[5]={1,2,3,4,5};
                int *p = arr+3;
                
                printf("arr+3=%p\n",arr+3);
                printf("p=%p\n",p);
                
                p--;
                printf("p-- = %p\n",p);
                
                p++;
                printf("p++ = %p\n",p);
                
                
            }
            
            #include<stdio.h>
            int main()
            {
                int a=10;
                int b=34;
                
                int *pa=&a;
                int *pb=&b;
                //指針相減,表示兩指針之間的距離
                printf("pa-pb=%ld\n",pa-pb);
                //指針相加沒有意義
                printf("pa+pb=%ld\n",pa+pb);
                
            } 

1、兩個(gè)類型相同的指針相加毫無(wú)意義。
比如p1和p2都是類型為int的指針,
雖然他們指向的內(nèi)存中保存了兩
個(gè)int數(shù)N1和N2,但是這兩個(gè)數(shù)在內(nèi)存中
可能挨著,也可以能間隔很遠(yuǎn),甚至有
可能是一個(gè)地方。假設(shè)p1值也就
是N1位置起始值為1234,P2為2345,這個(gè)時(shí)候如果直接相加得到的數(shù)據(jù)
3589有可能已經(jīng)超出了內(nèi)存最大值或者指向某個(gè)無(wú)意義的內(nèi)存地址,所以
指針相加沒有意義可言。正確的應(yīng)該是N1和N2相加才是合理的算數(shù)運(yùn)算。

2、指針可以相減,可以和立即數(shù)加或減,是有意義的,是允許的。比如我想知道N1和N2之間到底間隔了多少字節(jié)的內(nèi)存,兩者相減就相當(dāng)于尺子上兩個(gè)刻度相減,也就是長(zhǎng)度或者寬度了。另外,和立即數(shù)的加減主來(lái)快速尋址,比如我有一個(gè)數(shù)組,起始指針為P0,如果數(shù)組保存的是一系列INT值那么 P0+2*sizeof(int)得到的值就是第三個(gè)元素的所在位置的地址,也是一個(gè)
指針,是有意義的(因?yàn)椴煌恼Z(yǔ)言和系統(tǒng),int值每次所占的字節(jié)數(shù)可能不一致,
所以使用sizeof函數(shù)去求得而不是直接加常規(guī)的4)。

(3) 指針加減一個(gè)常量,表示地址往高字節(jié)或底字節(jié)方向移動(dòng)

                 常量值*sizeof(對(duì)應(yīng)數(shù)據(jù)類型)個(gè)字節(jié)
                 
                 
              (4) 概念區(qū)分
                  int arr[3];
                  //數(shù)組大小為3,存放三個(gè)int型變量
                  int *pb;
                  //指針,棋類型為int *型
                  int *arr[3];
                  //指針數(shù)組  具體是什么看后面的兩個(gè)字
                  
                  int (*pa)[3]; 
                  //首先是指針 后是數(shù)組  所以是
                    數(shù)組指針,又稱 行指針
                    
                    #include<stdio.h>
                    int main()
                    {
                        int arr[4]={1,2,3,4};
                        int *buf[4];
                        int (*pa)[4];
                        int i=0;
                        for(i=0;i<4;i++)
                        {
                           buf[i]=&arr[i];
                        }
                        pa=&arr;
                        printf("%d\n",*buf[2]);  =3
                        printf("%d\n",(*pa)[1]); =2
                        
                    } 

2.二級(jí)指針

 DataType **PointorName;
 
 int a = 10;
 
 int *q = &a;
 
 int **p = &q;
 
 *p=q;
 **p=*q=a;
 定義一個(gè)指針,
 或?qū)Φ刂愤M(jìn)行操作時(shí),
 一定要確定指針的指向
    #include<stdio.h>
    int main()
    {
        int a=10;
        int *p=&a;
        int **pa=&p;
        
        printf("&a=%p\n",&a);
        printf("p=%p\n",p);
        printf("&p=%p\n",&p);
        printf("pa=%p\n",&pa);
        
        printf("*p=%d\n",*p);
        printf("**pa=%d\n",**pa);
        
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評(píng)論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,835評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,235評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,459評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,819評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,004評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,257評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評(píng)論 1 288
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,717評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,003評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • 作業(yè)整理; 指針的基本的結(jié)構(gòu)與基礎(chǔ)知識(shí)整理; 作業(yè)講解:(1) 將2~100之間的素?cái)?shù) 保存到數(shù)組中,并遍歷輸出,...
    比莉吉恩閱讀 371評(píng)論 0 0
  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,464評(píng)論 3 44
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,532評(píng)論 1 51
  • 一、框架 1、Mac系統(tǒng)及常用工具、進(jìn)制;C數(shù)據(jù)類型、常量變量、運(yùn)算符、表達(dá)式、格式化輸入輸出 2、關(guān)系運(yùn)算符、邏...
    師景福閱讀 711評(píng)論 0 2
  • 今天繼續(xù)來(lái)聊聊L小姐的故事。 自從L小姐與男友分手后的這一年來(lái),她變了很多。就像微博上狂刷不停的熱點(diǎn)一樣,通常男女...
    水木梁魚閱讀 580評(píng)論 0 3