一、指針運算
//*p 代表的是它所指向的地制上面的值的運算
//p++ 是p 指針變量++岩四,結(jié)果就是:p指向它的下一個地址
int main(){
int a = 10;
int *p = &a; //申明一個int類型的指針變量 p //&a取變量a的地址
*p = *p + 10; //p指向的是a在內(nèi)存的地址,*p是取地址上的值, a = a + 10 a = 20哭尝;
printf("p:%d, a:%d\n",p,a);
int y = 1 + *p; // p指向的是a在內(nèi)存的地址,*p是取地址上的值 y = 1+a = 21
printf("y:%d \n", y);
*p += 1; //將地制所指向的值+1 再付給自己 相當(dāng)于 現(xiàn)在 a+=1 a = 21;
printf("p:%d, a:%d\n", p, a);
(*p)++; //將*p所指向的值 a++ ; a = 22
printf("p:%d, a: %d , p address: %#x \n",*p,a,p);
//將p的地址位移 根據(jù)運算符的優(yōu)先級 先進(jìn)行 ++ 運算 再進(jìn)行 *p運算(不要輕易的執(zhí)行這樣的運算剖煌,因為你得出的這一個新地址不知道是誰在使用)
//p是int類型指針變量,*p++ = *(p++) ,p存儲的是a的內(nèi)存地址,p++是地址做偏移,然后*p再取了一個新的地址上面的值.
*p++;
printf("p:%d, a: %d , p address: %#x \n", *p, a, p);
system("pause");
return 0;
}
二材鹦、數(shù)組與指針
//例`:
int main(){
int a[5];
int *p = a;//數(shù)組名a,就是數(shù)組的首地址 所以可以直接賦值
int i;
printf("%#x\n",a);
//a+5,表示a 移動到數(shù)組的第5個位置 按照地址移到五個地址的長度
//p++ 指針位移
for (i = 0; p < a + 5;p++){
*p = i; //給指針?biāo)傅闹蒂x值耕姊,相當(dāng)于給數(shù)組a 賦值
i++;
}
system("pause");
return 0;
}
//例2:
int main(){
int a[5] = {1,2,3,4,5};
int *p = a;//數(shù)組名a桶唐,就是數(shù)組的首地址 所以可以直接賦值
int i;
printf("%#x\n",a);
p = p + 1; // 等價于 p++
printf("p:%d\n",*p);
//以下幾個操作是相等的
//a[i] == *(p + i)
//&a[i] == a + i;
//p + i == &a[i] ==a+i
system("pause");
return 0;
}
三、指針和函數(shù)參數(shù)
java中:
int a = 10;
int b = a;//是將a對象所指向的引用的賦給b,所以b = 10;
C/C++中:
void swap(int c,int d){
int temp;
temp = c;
c = d;
d = temp;
}
int main() {
int a = 10;
int b = 5;
swap(a,b);
//因為C/C++中,相當(dāng)于將a和b的值一份給函數(shù)swap()的參數(shù)c和d,c和d也會有一個新的內(nèi)存地址,但是a和b的內(nèi)存地址還是不會變的,他們的值也不變
printf(" a = %d,b = %d\n" , a, b); //a = 10 ,b = 5,
}
//實際上方法參數(shù)傳遞的時候是將a的值賦給d 將b 的值賦給e
//d跟e進(jìn)行了交換 對a跟b完成沒有關(guān)系
void swap(int d,int e){
printf("d address :%#x ,e address:%#x \n", &d, &e);
int temp;
temp = d;
d = e;
e = temp;
}
//行參的修改不能帶來這個實參的修改
//將a b 的地址copy給了 形參 茉兰,然后尤泽,將這份copy的地址進(jìn)行了切換,而地址所指向的值是沒有變的
void swap2(int *a, int *b){
printf("a address :%#x ,b address:%#x \n", a, b);
int *temp;
temp = a; //a的 地址給了temp
a = b; //a 地址變成了b的地址
b = temp; //將b的地址變成了a的地址
printf("a address :%#x ,b address:%#x \n", a, b);
}
void swap3(int *a, int *b){
int temp;
temp = *a; //將地址對應(yīng)的值取出來 賦給temp
*a = *b; //將b地址所在的值 賦給了a地址所在的值
*b = temp; //將temp里面的值 賦給 b地址所在的值
}
int main(){
int a, b;
a = 10;
b = 5;
printf("a address :%#x ,b address:%#x \n", &a, &b);
//這樣的方式只是將a跟b的值賦給了swap方法的參數(shù)不能將a和b的值進(jìn)行交換
swap(a, b);
printf("a=%d,b=%d\n",a,b);
//swap2方法中的a 存的是一個地址的副本 達(dá)不到修改的值效果
swap2(&a, &b);
printf("a=%d,b=%d\n", a, b);
//此方法完成了a b 的交換
swap3(&a, &b);
printf("a=%d,b=%d\n", a, b);
system("pause");
return 0;
}
四规脸、指針數(shù)組
#include "string.h"
void sort(char *name[],int n);
int main(){
//指針數(shù)組 :是一個數(shù)組坯约,數(shù)組里面存放的是指針類型的變量
char *name[] = {"hello","hubin","axoo","world"};
int i, n = 4;
//給字符串排序
sort(name, n);
for (i = 0; i < n; i++){
printf("%s\n", name[i]);
}
//數(shù)組指針:是一個指針,這個指針指向的是一個數(shù)組的首地址
//p2是一個指針變量名
//p2指向的是一個數(shù)組莫鸭,一個有5個元素的數(shù)組
char(*p2)[5]; //定義了一個數(shù)組指針
system("pause");
return 0;
}
//冒泡排序
//參數(shù)闹丐,是char類型的指針數(shù)組
//name[i] 是一個指針
void sort(char *name[], int n){
char *temp;
int i, j;
for (i = 0; i < n; i++){
for (j = 0; j< n - 1 - i; j++){
if (strcmp(name[j],name[j+1])>0){ //根據(jù)字母進(jìn)行比較 相等返回 0
temp = name[j]; //將指針進(jìn)行了切換
name[j] = name[j + 1];
name[j + 1] = temp;
}
}
}
}
五、 二級指針
int main(){
int a = 100;
int *p;
p = &a;
int **p2;
p2 = &p;
//二級指針 被因,存的內(nèi)容是一個一級指針的地址
//p的值就是p這個變量卿拴,這個變量保存的是a的地址
//*p 運算,得到的就是a的值
//*p2 運算梨与,得到的就是p的值
//**p2 運算堕花,得到的就是p的值的 *運算得到的值 a;
return 0;
}
六蛋欣、知識要點
1航徙、C語言中的函數(shù)如何調(diào)用?
1)先申明函數(shù)才能調(diào)用
int function(){
return 0陷虎;
}
int main(){
function()
return 0到踏;
}
2)如果函數(shù)體再后面也要先申明才可調(diào)用
int function();
int main(){
function()
return 0;
}
int function(){
return 0尚猿;
}
2窝稿、頭文件的引入和定義
系統(tǒng)定義的頭文件是使用<> 引入 如:#include <stdlib.h>
自定義的頭文件是使用 "" 引入 如: #include "hubin.h"
1)創(chuàng)建源文件 hubin.c 里面定義一個fun函數(shù)
#include "hubin.h"
void int fun(int a ){
return a++;
}
2)創(chuàng)建頭文件 hubin.h 定義方法函數(shù)
void ing fun(int a);
3)引入自定義的頭文件調(diào)用fun()函數(shù)
#include "hubin.h"
int main(){
int a = 0;
fun(a);
return 0;
}
3凿掂、運算符的優(yōu)先級
4伴榔、p 和 *p 有什么區(qū)別
int main(){
int *p;
//p是一個指針變量名
//*p 是從p指針變量里面取出一個int 型數(shù)據(jù)
}
5纹蝴、為什么會有 int *p 和 char *cp 的類型定義
指針變量都是用于存地址的,而地址都是用4個字節(jié)的數(shù)字表示的踪少,
所以指針變量都是占用4個字節(jié)
p++ cp++ 的運算會隨著指針的類型位移的距離不同
p++位移4個字節(jié)
cp++ 位移一個字節(jié)
正是因為有這樣的區(qū)別 所以我們指針要有類型的卻別定義