段錯誤,無效空位址的指針的引用會發生錯誤。
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]);
}