常用數據類型字節數
類型 | 16位 | 32位 | 64位 |
---|---|---|---|
char | 1 | 1 | 1 |
short int | 2 | 2 | 2 |
int | 2 | 4 | 4 |
unsigned int | 2 | 4 | 4 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
long | 4 | 4 | 8 |
long long | 8 | 8 | 8 |
unsigned long | 4 | 4 | 8 |
16位編譯器:char*:2個字節
32位編輯器:char*:4個字節
64位編輯器:char*:8個字節
const int *p 與int *const p的區別,使用代碼來分析:
#include <iostream>
using namespace std;
int main() {
int i1 = 40;
int i2 = 20;
const int *p;
p = &i1;
p = &i2; //不報錯
*p = 80; //報錯
//表明如果const在*前面表示*p是常量。
i2 = 80;
cout << *p << endl;
return 0;
}
#include <iostream>
using namespace std;
int main() {
int i1 = 40;
int i2 = 20;
//p = &i1; //報錯
int * const p = &i1;
//p = &i2; //報錯
*p = 80; //不報錯
//表明如果const在*後面表示p是常量。
i2 = 80;
cout << *p << endl;
return 0;
}
補充三種情況
情況一:int *p 指針指向const int i1常量的情況
#include <iostream>
using namespace std;
int main() {
const int i1 = 20;
int *p;
//p = &i1; //報錯,const int 類型的i1的地址是不能賦值給指向int類型地址的指針pi的,否
//則pi豈不是能修改i1的值了嗎?
p = (int *) &i1;
cout << *p << endl;
*p = 80;
cout << *p << endl;
cout << i1 << endl;
return 0;
}
輸出答案:
i1的值沒有改變。
#include <iostream>
using namespace std;
int main() {
const int i1 = 20;
int *p;
p = (int *) &i1;
cout << p << endl;
cout << *p << endl;
*p = 80;
cout << p << endl;
cout << *p << endl;
cout << i1 << endl;
cout << &i1 << endl;
return 0;
}
輸出:
目前沒有搞懂原因。
情況二:const int *pi 指針指向 const int i1的情況
兩個類型相同,可以如下程序所示賦值。i1是不可以通過pi和i1來修改的。
#include <iostream>
using namespace std;
int main() {
const int i1 = 20;
const int *p;
p = &i1;
cout << *p << endl;
return 0;
}
情況三:用const int *const p1聲明指針
#include <iostream>
using namespace std;
int main() {
int i1 = 20;
int i2 = 10;
const int *const p = &i1;//必須在定義是初始化。
//p = &i2; //報錯
//*p = 80; //報錯
cout << *p << endl;
return 0;
}
指針變量本身與其它變量一樣也是在某個內存地址中的。我們也可以讓某個指針指向這個地址。
short int *p;
short int **pp; 聲明瞭一個指針變量pp,這個pp是用來存儲(或者指向)一個short int * 類型指針變量的地址。
pp = &p; 就是將p的地址賦給了pp。
例子:
#include <iostream>
using namespace std;
int main() {
short int a;
short int *p;
short int **pp;
a = 10;
p = &a;
pp = &p;
cout << a << endl;
cout << *p << endl;
cout << **pp << endl;
return 0;
}
輸出是:
數組名和指針
1:通過數組名訪問數組元素
寫法有兩種如下所示:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[] = {1,2,3,4,5,5,6,7,8};
int len = sizeof(a)/sizeof(int);
cout << len << endl;
//方法一
for(int i = 0; i < len; i++)
{
cout << a[i] << " ";
}
cout << endl;
//方法二
for(int i = 0; i < len; i++)
{
cout << *(a+i) << " ";
}
cout << endl;
return 0;
}
2:通過指針訪問數組元素
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[] = {1,2,3,4,5,5,6,7,8};
int len = sizeof(a)/sizeof(int);
cout << len << endl;
int *p;
p = a;
//方法一
for(int i = 0; i < len; i++)
{
cout << p[i] << " ";
}
cout << endl;
//方法二
for(int i = 0; i < len; i++)
{
cout << *(p+i) << " ";
}
cout << endl;
return 0;
}
3:指針變量和數組名的區別
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[] = {1,2,3,4,5,5,6,7,8};
int len = sizeof(a)/sizeof(int);
cout << len << endl;
int *p;
p = a;
//數組名與指針常量的區別 \
//使用指針
for(int i = 0; i < len; i++)
{
cout << *p << " ";
p++;
}
cout << endl;
//使用數組名
// for(int i = 0; i < len; i++)
// {
// cout << *a << " ";
// a++; //會報錯 因爲數組名相當於一個指針常量 ,不可以修改。
// }
cout << endl;
return 0;
}