IOS學習---C語言基礎學習7(指針)

指針:
格式:變量類型 *變量名;
定義一個指針變量p  int *p;
指針變量只能存儲地址
p = &a 
指針的作用:
  跟狗根據一個地址值,訪問對應的存儲空間
指針變量p前面的int:指針變量p只能指向int類型的數據

注意:
不建議下述寫法
1、
int  *p;
double d = 10.0;
p=&d;
int *p只能指向int類型的數據
2、
int *p;
p = 200;
指針變量只能存儲地址
3、int *p;
printf("%d",*p)
指針未經過初始化,不要拿來間接訪問其他存儲空間
4、
int *p = &a;正確
int *p; *p = &a; 錯誤 int *p; p=&a;正確
原因:定義指針時 int *p = &a;可以理解爲 (int *)p = a;
只是爲了說明p是一個整型的指針類型變量
注意:
int *p;定義變量時的*僅僅是一個象徵,沒有其他特殊含義
*p=a;這個時候*的作用:訪問指針變量p指向的存儲空間

指向指針的指針:
格式:
int a =10;
int *p = &a;
int **pp = &p;((int *)*p = &p)指向指針的指針

指向任何類型的指針都佔用8個字節,爲什麼指針還要分類型呢?

原因:
輸出值:
int i =2;                     int i =2; 
char c =1;                    char c =1;

char *p;                      int *p;
p=&c;                         p=&c;

printf("d%",*p);            printf("d%",*p)

輸出結果是: 1                輸出結果爲513
取值:
int i = 2;
char c = 1;

int *p;
p=&c;

*p=10;
printf("%d",*p);   取出數據錯誤
原因:由於 *p爲int 類型 默認爲四個字節 
*p = 10; 將10的值賦給p指向的地址
而 p指向的地址爲char值得問題

原因:內存中的存儲,i(4個字節),c(1個字節) 二者相鄰
int *p;p=&c 表示 指針p指向變量c的地址
由於 i爲整型,所以默認要從首地址c開始向後取四個字節
因此取到了非變量c的值。因此 指針類型的定義時很有必要的否則可能造成取出的數據不是想要的

指針與數組:
int ages[5]={1,2,3,4,5};
int *p;
p=ages[0];//或者p=ages  數組名錶示數組的起始地址,表示數組的第一個元素的地址
printf("%d",*p);
for(int i= 0 ;i< 5;i++)
{
printf("ages[%d] = %d",i,*(p+i));
}
數組元素的訪問方式:
1、數組名[下標] ages[0]
2、利用指針變量名[下標] p[1]
3、*(p+i)
指針變量的+1,究竟加多少,取決於指針的類型
若爲 int*   +4    char* +1   double *   +8

地址傳遞,不一定要從首地址開始
change(&ages[2]);
傳遞的是ages[2]的地址

指針與字符串
char *name2 = "it";
指針變量name2指向了字符串的首字符
printf("%s\n",name2) 輸出結果爲 it
"%s" 從name2開始輸出字符串 直到遇到\0爲止

字符串定義的兩種方式:
1、利用數組
char name[] = "it"
可以通過 name[0] = T;進行更改
適用場合:字符串的內容需要經常修改
2、利用指針
char *name = "it";
*name = 'T' 錯誤  不可進行更改
原因:字符串其實是一個常量字符串,裏面的字符不能修改
根本原因:在內存中的存放地址不同,第一種存放於變量區,第二種存放於常量區
使用場合:字符串的內容不需要修改,而且這個字符串經常使用
內存:
1、常量區
存放常量字符串
2、堆
對象
3、棧
存放局部變量

字符串數組存放方法
指針數組:
char *names[5] = {"jack","rose","lee"};
二維字符數組
char name1[2][10] = {"jack","rose","lee"};

字符串輸入:

char name[20];
scanf("%s",name);
name爲數組的首地址,‘%s’的存入時表示從首地址開始直到遇見‘\0’結束

返回指針的函數:
char *test()
{
return "rose";//返回“rose”的首地址
}
int main()
{
char *name = test();
printf("%s",name);
}

指向函數的指針:
void test()
{
printf("調用了test函數");
}

int main()
{
int ages[5];
//(*p)是固定寫法,代表指針變量p將來肯定是指向函數
//左邊的void:指針變量p指向的函數沒有返回值
//右邊的():指針變量p 指向的函數沒有形參
void (*p)();

p = test;//指針變量p指向test函數

p();//也可以調用test函數

(*p)();//利用指針變量間接調用test函數

test();//直接調用函數;

return 0;
}

int sum(int a,int b)
{
return a+b;
}

int main()
{
定義指針變量指向sum
//左邊int:指針變量p指向的函數返回int類型數據
//右邊的(int,int):指針變量p指向的函數有2個//int類型的形參
int(*p)(int ,int );
p=sum;
int c = p(10,11);//調用函數法1
int c = (*p)(10,11);//調用函數方法2
int c =sum(10,11);//調用函數方法3
}

要求:
掌握:
1、看懂語法
2、定義指向函數的指針 
    double (*p)(double char*,int); p = sum;
    或者
    double(*p)(double,char*,int) = sum;
3、如何間接調用函數
   1、p();
   2、(*p)();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章