天天看點

C語言---指針--day01

段錯誤,無效空位址的指針的引用會發生錯誤。

const指針,

const int *p 與int* const p 差別:

前者是固定了指針所指位址記憶體中的資料不可變

後者是固定了指針位址不可變。

限制p,即固定了位址。

限制了*p就固定了資料。

野指針,位址有效但無可用資料。

*p++ = j+i;給指針*p指派。

數組就是指針:(之間也有很大的差別,指針沒有記憶體空間來存放資料,數組有記憶體空間可以存放資料)。

array[]是一維數組;

p = array;//p = &array[0]

int array[5];

array = array[0];

array[4] = *(array+4);

指針的下标形态:

int* p;

array[4] = p[4];

指針排序:

    int flag = 0;

    for(int i = 0;i<n;i++){

        for(int j = 1;j<n-i;j++){

            if(*p<*(p+j)){

                flag = *p;

                *p = *(p+j);

                *(p+j) = flag;

            }

        }

        printf("array[%d] = %d \n",i,*p);

        p++;

    }

指針+記憶體+char數組:

http://blog.csdn.net/iamfranter/article/details/6826248

指針與數組的差別:

指針能做的數組不一定能做;

數組能做的指針不一定能做:

    char aa[] ="you are bad";

    //    aa = "ou";()

   char ab[12] ="you are bad";

    //    ab = "ou";()

   //上面的數組aa/ab數組不能像下面的指針“ac”這樣應用,因為數組在建立時指針(aa/ab)的位址

   //已經被綁定到被配置設定的記憶體位址,是以不可以再變動

   char* ac =NULL;

    ac = "you are bad";

   //    ac[0] = 'o';這個複制表達式能否完成依靠編譯器,如果編譯器允許就可以

    ab[0] ='o';//通過;

添加頭檔案:#include<stdlib.h> free(viod);釋放指針。

指針與數組的差別:

char* p = “hello”;

p[0] = ‘X’;//不能成功指派:編譯器不會覺得沒有什麼不妥,但是表達式企圖改變常量值是不能夠通過的。

char a[] = “hello”;

a[0] = ‘X’;//成功,這是數組的指派,與指針相比,指針不會被配置設定記憶體,而數組可以被配置設定記憶體。是以 a[0] = ‘X’成功編譯。

char數組的比較不能用“==”或“!=”,要用strcmp();而且指派不能用a = b;而是要用:strcp(a,b);(把b指派給a)。

計算記憶體容量sizeof(int);

char* p = “123”;

對strlen的掌握,它沒有包括字元串末尾的’\0'。

char chr[3];

strcpy(chr,p);//出錯,strcpy在為把“123”複制到chr之後結束時會把結束标示“\0”作為一個元素添加到chr中,如果chr的元素不夠,便會出錯。

而且如果一個數組中被重新全部指派後(包括\0位),strcp()方法在操作時若是找不到“\0”标示符,strcpy會一直指派下去,即便被指派數組越界。

野指針:野指針不能夠被使用,不可以被指派。//int *p; *p = *pn; 或*pt = *p;都是不被允許的,因為野指針有可能指向系統區,而系統區的資料是不可以被更改的。

數組指針的使用。

#include<stdio.h>

#include<stdlib.h>

#include"time.h"

int main(){

     char *p[5] = {NULL};

     srand((unsigned)time(NULL));

0. //sum取1-10之間的整數;

     int i,sum = rand()%10+1;

     for(i = 0;i<sum;i++){

1. //給每個元素申請記憶體空間

         p[i]=(char *)malloc(sizeof(char)*100);

2. //檢查每個指針的值是否位NULL,NULL不可被使用(用來存儲資料);

if(p[i]==NULL) break;

else  scanf("%s",p[i]);

     }

     for (i=0; i<sum; i++) {

          printf("%s\n",p[i]);

     }

for(int i = 0;i<5;i++){

3. //指針數組使用完畢需要被釋放記憶體

free(p[i]);

4. //被釋放記憶體的指針數組需要被置空:NULL,防止産生野指針。

p[i] = NULL;

}

     return 0;

}

記憶體配置設定:

記憶體的靜态存儲區:常量(值不可被修改)

棧上配置設定:局部變量(生存周期短,不可被return使用。)

堆上非配:user申請的,親自申請的記憶體存儲空間需要手動釋放,要不然會造成記憶體洩露,而且釋放之後的指針要置為NULL,要不然會生成野指針。

p+=6;  p = p+6;

函數參數不超過4個。

數組指針:

#include<stdio.h>

#include<stdlib.h>

#include"time.h"

int main(){

     int carray[2][5] = {2,6,8};

//int [5] carray[2];

//int [5] *pp;

int (*pp)[5] = NULL;

pp = carray;

//*pp = &carray[0];*(pp+1) = &carray[1];     

     printf("%d",*(carray[0]+1));

//看懂就懂了。

//pp = carray;

//carray預設等于carray[0]位址。

//*pp = carray = carray[0] 

//*(pp+1) = carray[1]

//*pp+1 =carray[0]+1 = carray[0][1] 

     return 0;

}

詳解:

*pp:指針變量指向記憶體中的資料

&pp:指針變量的位址

  pp:指針變量所指向的位址(存儲的位址)。

二位數組作為函數參數,a[][5]中的5不可少。否則報錯。

數組指針PK指針數組?

數組指針:int (*p)[5]

可寫成:    int[5] *p

指針*p是一個指向數組int[5]的指針

指針數組:int* p[5]

一個包含5個指針的數組。

使用指針數組的元素來周遊數組元素。

#include<stdio.h>

#include<stdlib.h>

#include"time.h"

int main(){

     int array[10] = {2,5,6,4,7};

     int *parray[5]  = {NULL,NULL,array+1};

     //printf("parray[0] = %p",parray[0]);

     for(int i= 0;i<5;i++){

          printf("%d\n",*(parray[2]+i-1));

     }

     for(int i = 0;i<5;i++){

          parray[i] = (int*)malloc(sizeof(int)*100);

     }

     for(int i = 0;i<5;i++){

          free(parray[i]);

          parray[i] =NULL;

     }

     return 0;

}

#include<stdio.h>

#include<stdlib.h>

#include"time.h"

int main(int a,char* arg[]){

//     printf("%c\n",arg[1][2]);

//     printf("%c\n",*(arg[2]+0));

//     printf("%c\n",*(arg[2]+1));

 //從arg[2]所指向字元串的第二個元素開始輸出,直到結尾

     printf("arg[2]+2 = %s\n",arg[2]+2);

 //輸出的時arg[2]所指向字元串的第二個元素。

     printf("*(arg[2]+2) = %c\n”,*(arg[2]+2));

 //從arg[3]所指向的第二進制素開始輸出,直到結尾

     printf("arg[3]+2 = %s\n",arg[3]+2);

     char arr[20] = "you are SB";

     arg[4] = arr;

     printf("arg[4]+4 = %s\n",arg[4]+4);

     printf("arg[0]+132 = %s\n",arg[0]+132);

     int array[10] = {2,5,6,4,7};

     return 0;

}

使用指針數組:

可以選擇從數組的某個元素開始周遊輸出。

也可以輸出單個數組元素。

一個指針數組的每一個元素可以用來周遊任意一個數組。

int main(){

char* array[5] = {NULL};

char a[] = "youno1";

array[0] = a;

//指針的形式:

printf("%c\n",*(array[0]+1));

//數組的方式:

printf("%c\n",a[1]);

//指針下标的方式:

printf("%c\n",array[0][1]);

}

繼續閱讀