c語言-數據類型及指針總結

常用數據類型字節數

類型 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;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章