const 變數和指標
由於經常在使用const限定符會有一些不確定的想法,需要查詢書籍或網上才能確定到底是限定了那個,特此在這裡驗證,待後續發表日記記錄 ,const 的限定的是資料還是地址,還是同時限定
總結
- int* const ptr_var; 或者可以寫為 const int* ptr_var;(指標常量)
a. 指標相當於一個常量(eg:指標指向某一塊地址後不能在改變指向,即指向var1後,不能在重新指向var2,var3…等其他變數)
b. 可以通過指標解引用修改變數的值(eg: *ptr_var = x, ptr_var指向的變數var1 值也跟隨改變) - int const *ptr_var;(常量指標)
a. 該指標可以值指向其他地址(可以指向var1,var2…)
b. 可以通過指標指向的變數來改變指標指向地址的值(eg:當指標指向var2時,可以通過改變var的值來改變*ptr_var對應的值)
c. 不能通過指標解應用對指標指向地址的值進行修改(eg:不能通過*ptr_var = x的賦值運算來改變值) - const int* cosnt ptr;
a. 指向一個地址後不能在改變指向
b. 不能通過解引用重新更改地址對應的值
c. 可以通過改變指向變數的值來更換地址中指向的值
#include<stdio.h>
void scan_out();
void test_var_const();
void test_const_var();
void test_ptr_const_var();
void test_const_ptr_var();
void test_const_ptr_const_var();
int main()
{
// 由於經常在使用const限定符會有一些不確定的想法,
// 需要查詢書籍或網上才能確定到底是限定了那個,
// 特此在這裡驗證,待後續發表日記記錄
// const 的限定的是資料還是地址,還是同時限定
char flag = 'y';
while (flag == 'y' || flag == 'Y'){
scan_out();
short test_number; // short 對應的格式化字串 %hd
printf("輸入對應的測試用例:");
scanf("%hd", &test_number);
switch(test_number) {
case 1:
test_const_var();
break;
case 2:
test_var_const();
break;
case 3:
test_ptr_const_var();
break;
case 4:
test_const_ptr_var();
break;
case 5:
test_const_ptr_const_var();
break;
default:
break;
}
getchar(); // 接受輸入測試用例編號 test_number後的回車符Enter
printf("是否繼續執行測試用例(y/n):");
flag = getchar();
}
}
void scan_out()
{
printf("----------C Const test------------\n");
printf("1. const 常量(eg: const int a).\n");
printf("2. const 常量(eg: int const a)\n");
printf("\n");
printf("3. const 指標常量(eg: int *const ptr_var).\n");
printf("4. const 指標常量(eg: int const *tr_var).\n");
printf("\n");
printf("5.指向常量的const指標(eg: const int* const ptr_var).\n");
}
void test_const_var()
{
// 給定一個常量,判斷值是否能改變
const int var = 10;
printf("開始改變常量的值 var = %d\n", var);
// var = 20; // 編譯的時候會報錯:assignment of read-only var
}
void test_var_const()
{
// 給定一個常量,判斷值是否可以更改
int const var = 30;
printf("開始改變變數的值 var = %d\n", var);
// var = 14; // 編譯的時候會報錯:assigment of read-only var
}
void test_ptr_const_var()
{
int var1 = 10;
int var2 = 20;
int* const ptr_var = &var1;
printf("開始改變* const_ptr_var的指向 *const_ptr_var = %d\n", *ptr_var);
// ptr_var = &var2; // 編譯會報錯:assignment of read-only variable 'ptr_var'
// 使用指向的變數改變指標指向地址的值
var1 = 30; // 可以改變指標指向地址的值
printf("開始改變* const_ptr_var的指向地址的值 *const_ptr_var = %d\n", *ptr_var);
// 使用指標改變指標指向地址的值
*ptr_var = 520;
printf("開始改變* const_ptr_var的指向地址的值 *const_ptr_var = %d\n", *ptr_var);
// 在指向變數的指標改變指向變數的之後,是否也改變了變數的值?
// 變數的值已經被改變
printf("通過指標改變變數的值後變數對應的值是:var1 = %d\n", var1);
}
/* int* const ptr_var; 或者可以寫為 const int* ptr_var;(指標常量)
* 1. 指標相當於一個常量(eg:指標指向某一塊地址後不能在改變指向,即指向var1後,不能在重新指向var2,var3...等其他變數)
* 2. 可以通過指標解引用修改變數的值(eg: *ptr_var = x, ptr_var指向的變數var1 值也跟隨改變)
*/
void test_const_ptr_var()
{
int var1 = 13;
int var2 = 14;
int const *ptr_var = &var1;
printf("開始改變* const_*ptr_var的指向 const_*ptr_var = %d\n", *ptr_var);
var1 = 20;
printf("開始改變* const_ptr_var的指向 *const_ptr_var = %d\n", *ptr_var);
ptr_var = &var2;
printf("開始改變* const_ptr_var的指向 *const_ptr_var = %d\n", *ptr_var);
// 通過改變變數的值,改變指標指向的值
var2 = 520;
printf("對 var2 變數重新賦值:var2 = %d\n", *ptr_var);
// 通過指標改變變數的值
// *ptr_var = 520; //不能通過指標改變變數的值
printf("通過指標改變變數的值後變數對應的值是:var2 = %d\n", var2);
// printf("開始改變* const_ptr_var的指向 *const_ptr_var = %d\n", *ptr_var);
}
/*
* int const *ptr_var;(常量指標)
* 1. 該指標可以值指向其他地址(可以指向var1,var2...)
* 2. 可以通過指標指向的變數來改變指標指向地址的值(eg:當指標指向var2時,可以通過改變var的值來改變*ptr_var對應的值)
* 3. 不能通過指標解應用對指標指向地址的值進行修改(eg:不能通過*ptr_var = x的賦值運算來改變值)
**/
void test_const_ptr_const_var()
{
int var1 = 34;
int var2 = 54;
const int *const ptr_var = &var1;
printf("*ptr_var = %d, var1 = %d, var2 = %d\n", *ptr_var, var1, var2);
// ptr_var = &var2; // 編譯報錯:assignment of read-only varible 'ptr_var'
// *ptr_var = 56; // 編譯報錯:assignment of read-only location '*ptr_var'
var1 = var2;
printf("對var賦值後 *ptr_var = %d, var1 = %d, var2 = %d\n", *ptr_var, var1, var2);
}
/*
* 1. 指向一個地址後不能在改變指向
* 2. 不能通過解引用重新更改地址對應的值
* 3. 可以通過改變指向變數的值來更換地址中指向的值
*/
相關文章
- const修飾符的使用(修飾結構體指標,引用外部的const 變數)結構體指標變數
- 指標與const指標
- 指標變數指標變數
- C語言指標(二) 指標變數 ----by xhxhC語言指標變數
- 02_const修飾指標指標
- 巨集_變數_函式_指標_標頭檔案變數函式指標
- 第 10 節:複合型別-5. 指標 -- 指標與指標變數 -8. 多級指標型別指標變數
- 變數和函式宣告提升,let和var const區別變數函式
- 函式呼叫時用const保護指標函式指標
- 指標:存放記憶體地址的變數指標記憶體變數
- 智慧指標引用計數變化學習指標
- 1.變數:var,let,const變數
- C++中const與指標、引用的總結C++指標
- 當char型變數遇上char*型的指標變數指標
- 深入理解Go系列一之指標變數Go指標變數
- 變數的賦值 指標間接賦值變數賦值指標
- Java中的類(好似結構體) 物件(好似指標變數)變數 方法Java結構體物件指標變數
- var、let、const宣告變數的區別變數
- 指標函式 和 函式指標指標函式
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- 詳解c++指標的指標和指標的引用C++指標
- 全域性作用域中,用const和let宣告的變數去哪了?變數
- 指標常量和常量指標的區別指標
- C語言第九周作業(指標變數,記憶體訪問,取址,空指標)C語言指標變數記憶體
- 2018資料更新:人類發展指數和指標報告指標
- jmeter軟體指標和硬體指標(16.5)JMeter指標
- 型別的本質:對變數、型別、指標的理解型別變數指標
- 透過交換指標變數的值改變大小數字的位置-學習筆記指標變數筆記
- 1.0 - 指標和引用指標
- let const快取for迴圈的中間變數快取變數
- 對 “C語言指標變數作為函式引數” 的個人理解C語言指標變數函式
- [C++] 成員函式指標和函式指標C++函式指標
- 【C++系列】指標物件和物件指標的區別C++指標物件
- var、let、const變數宣告的區別及特點變數
- C陣列和指標陣列指標
- GO 空指標和nilGo指標
- 指標-n個數的排序指標排序
- 如何正確理解「指標」和「標籤」指標