簡介
指針是一個值為內(nèi)存地址的變量,不能賦常量值夹孔,必須要變量地址
&:取址操作符
*:取值操作符
int main() {
int a = 10;
int* b = &a;//&是取址操作符
printf("a變量的內(nèi)存地址是:%p \n",b);
printf("a變量內(nèi)存中儲存的值為:%d \n",*b);
//*是取值操作符
*b = 11;//修改a變量內(nèi)存地址中所保存的值
printf("修改后a變量的內(nèi)存地址是:%p \n",b);
printf("修改后a變量內(nèi)存中儲存的值為:%d \n",*b);
printf("修改后a變量內(nèi)存中儲存的值為:%d \n",a);
return 0;
}
輸出的日志如下
a變量的內(nèi)存地址是:0061FF28
a變量內(nèi)存中儲存的值為:10
修改后a變量的內(nèi)存地址是:0061FF28
修改后a變量內(nèi)存中儲存的值為:11
修改后a變量內(nèi)存中儲存的值為:11
指針與數(shù)組
數(shù)組就是一塊連續(xù)的內(nèi)存空間
數(shù)組名就是這塊連續(xù)內(nèi)存空間的首地址
num為一維數(shù)組
num[i] <====> *(num +i) 兩者等價
double score[5] = {98 ,97,65,43,25};
double * ptr_score;
ptr_score = score;
for(int i=0;i<5;i++){
printf("%.2lf\n",*ptr_score ++);
}
一個類型為T的指針移動独泞,以sizeOf(T)為移動單位哮奇。
比如double類型的變量指針++每次移動8個字節(jié)
double score[5] = {98.00, 97.00, 65.00, 43.00, 25.00};
double *ptr_score;
ptr_score = score;
for (int i = 0; i < 4; i++) {
printf("%.2lf\n", *(ptr_score++));
}
printf("%.2lf\n", *ptr_score);
當(dāng)數(shù)組指針移動后,再次打印的是當(dāng)前指針一下個SizeOf(T)的值
例子(數(shù)組逆序)
int score[5] = {98, 97, 65, 43, 25};
int *ptr_score_start = score; //數(shù)組首元素的指針
int *ptr_score_end = score + 4;//數(shù)組末元素的指針
int temp;
while (ptr_score_start != ptr_score_end) {
//首尾交換
temp = *ptr_score_start;
*ptr_score_start = *ptr_score_end;
*ptr_score_end = temp;
ptr_score_start++;
ptr_score_end--;
}
for (int i = 0; i < 5; i++) {
printf("%d\n", *(score + i));
}
二維數(shù)組與指針
二位數(shù)組的首地址:&a[0][0]
使用指針訪問二維數(shù)組中的元素
int score[5][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12},
{13, 14, 15}
};
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
//因為一維數(shù)組中score[i]等價與 score + i
//printf("%d \t", score[i][j]);
//printf("%d \t", *(score[i] + j));
printf("%d \t", *(*(score + i) + j));
}
printf("\n");
}
((score + i) + j)取值的理解:
因為score是一個二維數(shù)組导饲,所以score就相當(dāng)于一個指向score[0][0]的指針讯嫂。如下:
printf("%p \t %p\n", score, &score[0][0])=======》
0061FEE4 0061FEE4
所以當(dāng)i=0時,(score + i)就相當(dāng)于score對二維數(shù)組的第一行取值炕置,*score就等價與score[0],所以它還是個數(shù)組荣挨,即 ((score + i) + j)成立男韧。
注意
我們知道在一維數(shù)組中數(shù)組和指針是一一對應(yīng)的,但是當(dāng)我們對二維數(shù)組進行等價操作時會報如下錯誤:
必須定義指針類型默垄,什么鬼此虑?經(jīng)過查找相關(guān)資料我們知道,其實ptr_score相當(dāng)于子定義了一維空間口锭,即ptr_score時指向行首部地址的指針朦前,所以當(dāng)我們用一維指針去操作二維數(shù)組時,就會報指針類型錯誤鹃操。那么我們要怎么改呢韭寸?
如下所示:
就是我們在定義指針變量時去擴展它的維度就可以了。
數(shù)組和指針
輸出的日志如下:
字符串常量的首地址:00405070
字符數(shù)組的首地址:0061FF27
字符指針的首地址是:00405070
所以輸出日志驗證了上文的特性组民。