C和指針 相關基礎知識:記憶體的分配(譚浩強版) 1、整型變數的地址與浮點型/字元型變數的地址區別?(整型變數/浮點型變數的區別是什麼) 2、int *p,指向整型數據的指針變數。 3、通過指針變數訪問整型變數。 4、*p :指針變數p指向的存儲單元(變數) 5、p = &a——>> *p = *&a ...
C和指針
相關基礎知識:記憶體的分配(譚浩強版)
1、整型變數的地址與浮點型/字元型變數的地址區別?(整型變數/浮點型變數的區別是什麼)
2、int *p,指向整型數據的指針變數。
3、通過指針變數訪問整型變數。
4、*p :指針變數p指向的存儲單元(變數)
5、p = &a——>> *p = *&a
6、用指針作函數參數
7、調用函數中,由於虛實結合是採用單向的“值傳遞”方式,只能從實參向形參傳數據,形參值的改變無法回傳給實參。
8、引用一個數組元素可以用(1)下標法(2)指針法(占記憶體小,運行速度快)
9、指針提高效率在那些方面?(記憶體,運行時間??)
10、如果指針變數p已指向數組中的一個元素,則p+1指向同一數組中的下一個元素。
11、用指針變數作函數形參接受數組地址。數組指針和指針數組的區別
1 #include"iostream"
2 using namespace std;
3 int main()
4 {
5 void sort(int *p,int n);
6 int a[5],i;
7 cout<<"input array:"<<endl;
8 for(i=0;i<5;i++)
9 cin>>a[i];
10 cout<<endl;
11 sort(a,5);
12 cout<<" the sorted array:"<<endl;
13 for(i=0;i<5;i++)
14 cout<<a[i]<<" ";
15 cout<<endl;
16 return 0;
17 }
18
19 void sort(int *p,int n)
20 {
21 int i,j,k,temp;
22 for(i=0;i<n-1;i++)
23 {
24 k=i;
25 for(j=i+1;j<n;j++)
26 if(*(p+j)<*(p+k)) k=j;
27 temp=*(p+k);
28 *(p+k)=*(p+i);
29 *(p+i)=temp;
30 }
31 }
View Code
12、一個int占多少個位元組?原文鏈接
13、實參和形參的結合有一下4種形式:
實參 | 形參 |
數組名 | 數組名 |
數組名 | 指針變數 |
指針變數 | 數組名 |
指針變數 | 指針變數 |
14、實參數組名a代表一個固定的地址,或者說是指針常量,因此其值不可改變;形參數組名是指針變數,可以改變。
// a++ //語法錯誤,不可改變
15、字元串與指針。字元串數組/字元串變數/字元指針 存放字元串。
1 //test_3 指針存放字元串
2 #include<iostream>
3 using namespace std;
4 // #include<string> //字元串變數
5 int main()
6 {
7 char str1[]="I Love C++",str2[20],*p1,*p2;
8 p1=str1;
9 p2=str2;
10 for(;*p1!='\0';p1++,p2++)
11 *p2=*p1;
12 *p2='\0';
13 p1=str1;
14 p2=str2;
15 cout<<"str1 is "<<p1<<endl;
16 cout<<"str2 is "<<p2<<endl;
17 return 0;
18 }
View Code
16、函數與指針。函數的入口地址就稱為函數的指針。
1)、用函數指針調用函數
函數類型 (*變數名)(函數形參表)
1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 int max(int x, int y);
7 int (*p)(int,int);
8 int a,b,m;
9 p=max;
10 cin>>a>>b;
11 m=p(a,b);
12
13 cout<<"max is "<< m<<endl;
14 return 0;
15 }
16
17 int max(int x,int y)
18 {
19 int z;
20 if (x<y)
21 z=y;
22 else
23 z=x;
24 return(z);
25 }
View Code
2)、用指向函數的指針作函數參數。
3)、返回指針值的函數:指針函數。
類型名 *函數名(參數列表);int *a( int x,int y);
17、
1)、指向常量的指針(不允許通過指針變數修改它指向的對象的值)
const 類型名 *指針變數名
2)、常指針(指定指針變數的值為常量,即指針變數的指向不可改變)
類型名 *const 指針變數名
Tips:必須在定義是初始化,指定其指向。
指針變數的指向不可改變,但指針變數的指向變數的值可以改變。*p2=12;//合法
註意(const和*的位置)。const在*後面,請與定義指向常變數的指針變數的形式比較。
3)、指向常量的常指針(指針變數指向一個固定的對象,該對象的值不能改變)。
const 基本類型名 *const 指針變數名
18、void指針類型
19、引用與指針
為什麼用引用?
主要是把它當做函數參數,以擴充函數傳遞數據的功能。
(1)將變數名作為實參和形參。值傳遞是單向的,實參傳給形參,形參改變不影響實參的值。
因為在調用函數時,形參和實參不在同一存儲單元。
(2)使用指針變數做形參,實現兩個變數的值互換。
(3)以引用作為形參,在虛實結合時建立變數的引用,使形參名作為實參的引用,即形參成為實參的引用。
using namespace std; int main() { // const int a=100,b=10; void swap(int *p1,int *p2); // void swap(int &p1,int &p2); int a=10,b=100; int *pointer_1,*pointer_2,*p; pointer_1=&a; pointer_2=&b; cout<<a<<" "<<b<<endl; swap(pointer_1,pointer_2); // swap(*pointer_1,*pointer_2); //*pointer_1=20; // if (a<b) // { // p=pointer_2; // pointer_2=pointer_1; // pointer_1=p; // } cout<<a<<" "<<b<<endl; cout<<*pointer_1<<" "<<*pointer_2<<endl; return 0; } void swap(int *p1,int *p2) // void swap(int &p1,int &p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; // // int temp; // temp=p1; // p1=p2; // p2=temp; }View Code