最小單元(1字節(jié)byte)
的編號(hào)
,也就是地址
口語(yǔ)
中說的指針,通常指的是指針變量
,是用來存放內(nèi)存地址的變量&(取地址操作符)
取出變量的內(nèi)存 (起始地址
),把地址可以存放到一個(gè)變量中,這個(gè)變量就是指針變量int a = 10;
int * pa = &a;
*pa = 20;
printf("%d\n", a);
20
存放在指針中
的值都被當(dāng)成地址
處理32位
的機(jī)器,假設(shè)有32根地址線
,那么假設(shè)每根地址線在尋址的時(shí)候產(chǎn)生高電平(高電壓
)和低電平(低電壓)
就是(1或者0
),有2的32次方個(gè)地址. 在32位
的機(jī)器上,地址是32個(gè)0或者1
組成二進(jìn)制序列,那地址就得用4個(gè)字節(jié)的空間來存儲(chǔ),所以一個(gè)指針變量的大小就應(yīng)該是4個(gè)字節(jié)
.那如果在64位
機(jī)器上,如果有64個(gè)地址線,那一個(gè)指針變量的大小是8個(gè)字節(jié)
,才能存放一個(gè)地址。指針的定義方式是:type + *
int* pa;
char* pc;
float* pf;
printf("%d\n", sizeof(pa));
printf("%d\n", sizeof(pc));
printf("%d\n", sizeof(pf));
4
4
4
在x86下,指針變量的大小都是4.
2.1 指針±整數(shù)int main()
{int a = 0x11223344;
//int*pa = &a;
//*pa = 0;
char* pc = &a;
*pc = 0;
return 0;
}
因?yàn)橛?code>char*,解引用的時(shí)候只能訪問1個(gè)字節(jié)
,只能修改44
.
int main()
{int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("pa=%p\n", pa);
printf("pc=%p\n", pc);
printf("pa+1=%p\n", pa -1);
printf("pc+1=%p\n", pc -1);
return 0;
}
pa=00AFF7EC
pc=00AFF7EC
pa+1=00AFF7E8 //減4
pc+1=00AFF7EB //減1
int arr[10] = {0 };
int* p = arr;//數(shù)組名就是數(shù)組首元素的地址arr->&arr[0];
for (int i = 0; i< 10; i++)
{*(p + i) = i + 1;
}
int arr[10] = {0 };
char* p = arr;
int i = 0;
for (i = 0; i< 10; i++)
{*p = i + 1;
p++;
}
可以看見用char
類型解引用整型數(shù)組是不對(duì)的.01 02 03 04
對(duì)應(yīng)arr[0] = 67305985
.
野指針就是指針指向的位置是不可知
的(隨機(jī)的、不正確的、沒有明確限制的)
int* p;
*p = 20;
3.2 指針越界訪問int main()
{int arr[10] = {0};
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
for (i = 0; i<= sz; i++)
{*p = i;
p++;
}
return 0;
}
Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted.
int* test()
{int num = 100;
printf("%p\n", &num);
return #
}
int main()
{int* p = test();
*p = 200;
printf("%d\n", *p);
printf("%p\n", p);
return 0;
}
010FF754
200
010FF754
3.4 避免野指針int main()
{int a = 10;
int* pa = &a;
int* p = NULL;
return 0;
}
int a = 10;
//int* p = NULL;
//*p = 20;
int* p = &a;
if (p != NULL)
{printf("%d\n", *p);
}
10
4 指針運(yùn)算
4.1 指針±整型double arr[5] = {0};
double* p = arr;
int i = 0;
for (i = 0; i< 5; i++)
{printf("%lf ", *(p + i));
}
0.000000 0.000000 0.000000 0.000000 0.000000
浮點(diǎn)
用%f
#define N_VALUES 5
float values[N_VALUES];
float* vp;
int main()
{for (vp = &values[N_VALUES - 1]; vp >= &values[0]; vp--)
{*vp = 1;
}
for (int i = 0; i< N_VALUES; i++)
{printf("%f\n", values[i]);
}
return 0;
}
1.000000
1.000000
1.000000
1.000000
1.000000
實(shí)際在絕大部分的編譯器上是可以順利完成任務(wù)的,然而我們還是應(yīng)該避免這樣寫,因?yàn)闃?biāo)準(zhǔn)并不保證它可行。
4.2 指針減指針兩個(gè)指針相減的前提是:指針指向的同一塊連續(xù)的空間
int arr[10] = {0};
printf("%d\n", &arr[9] - &arr[0]);
printf("%d\n", &arr[0] - &arr[9]);
int a = 10;
char c = 'w';
printf("%d\n", &a - &c);//err
9
-9
2
5 指針和數(shù)組int my_strlen1(char* str)
{int count = 0;
while (*str)
{count++;
str++;
}
return count;
}
int my_strlen2(char* str)
{char* start = str;
while (*str)
str++;
return str - start;
}
//
int main()
{char arr[] = "abc";
int len1 = my_strlen1(arr);
int len2 = my_strlen2(arr);
printf("%d\n", len1);
printf("%d\n", len2);
return 0;
}
3
3
int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i< sz; i++)
{printf("%d\n", *(p + i));
}
1
2
3
4
5
6
7
8
9
10
6 二級(jí)指針int main()
{int a = 10;//
int* p = &a;//
int** pp = &p;//
//*(*pp) = 200;
**pp = 200;
//*p = 20;
printf("%d\n", a);
return 0;
}
200
7 指針數(shù)組指針數(shù)組是指針還是數(shù)組?答案:是數(shù)組
。是存放指針的數(shù)組。
int arr[10];
char arr2[5];
int* arr3[5];//存放整型指針的數(shù)組
char* arr4[6];//存放字符指針的數(shù)組
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int e = 50;
int* arr3[5] = {&a, &b, &c, &d, &e};//存放整型指針的數(shù)組
int i = 0;
for (i = 0; i< 5; i++)
{printf("%d ", *(arr3[i]));
}
10 20 30 40 50
int arr1[] = {1,2,3,4,5 };
int arr2[] = {2,3,4,5,6 };
int arr3[] = {3,4,5,6,7 };
int arr4[] = {4,5,6,7,8 };
int* arr[4] = {arr1, arr2, arr3, arr4};
int i = 0;
for (i = 0; i< 4; i++)
{int j = 0;
for (j = 0; j< 5; j++)
{ printf("%d ", *(*(arr+i)+j));
}
printf("\n");
}
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
上面的打印
可以寫為
int i = 0;
for (i = 0; i< 4; i++)
{int j = 0;
for (j = 0; j< 5; j++)
{ printf("%d ", arr[i][j]);
}
printf("\n");
}```
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
名稱欄目:指針(C語(yǔ)言)-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://jinyejixie.com/article12/hghdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站制作、企業(yè)建站、網(wǎng)站營(yíng)銷、虛擬主機(jī)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容