格式:變量類型 *變量名;
定義一個指針變量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)();