C语言指针(就做个笔记)
一、取地址運(yùn)算
1.sizeof()函數(shù)
用于求 變量或數(shù)據(jù)類型所占字節(jié)數(shù)
#include <stdio.h>
int main(){int num_1,num_2,a;a=2;num_1=sizeof(int);num_2=sizeof(a);printf("int所占字節(jié)數(shù)為%d\n",num_1);printf("整型a所占字節(jié)數(shù)為%d",num_2);return 0;
}輸出:
int所占字節(jié)數(shù)為4
整型a所占字節(jié)數(shù)為4
2.&運(yùn)算符
獲得變量地址,操作數(shù)必須是變量?
&(i++);
&(i+P);? ? ///這些都是不對(duì)的,必須有明確的變量
(1)變量?jī)?nèi)存地址?
#include <stdio.h>
int main(){int i=0;int a=1;printf("i的內(nèi)存地址為%p\n",&i);printf("a的內(nèi)存地址為%p",&a);return 0;
}輸出:
i的內(nèi)存地址為000000000062FE1C
a的內(nèi)存地址為000000000062FE18
%p? 是輸出16進(jìn)制
不難發(fā)現(xiàn)i,a變量,相差4個(gè)內(nèi)存地址。
聯(lián)系int所占字節(jié)數(shù)為4,所以,內(nèi)存地址的分配,按棧,自頂向下分配。
(2)數(shù)組內(nèi)存地址
#include <stdio.h>
int main(){int a[10];printf("a的內(nèi)存地址為%p\n",&a);printf("數(shù)組名 %p\n",a);printf("a[0] 的內(nèi)存地址為%p\n",&a[0]);printf("a[1] 的內(nèi)存地址為%p\n",&a[1]);return 0;
}輸出:
a的內(nèi)存地址為000000000062FDF0
數(shù)組名 000000000062FDF0
a[0] 的內(nèi)存地址為000000000062FDF0
a[1] 的內(nèi)存地址為000000000062FDF4
數(shù)組名所表示該數(shù)組所分配連續(xù)內(nèi)存空間中第一個(gè)單元的地址,即首地址。
內(nèi)存地址:a[0]==a==&a?
二、指針
1.指針定義
指針用來(lái)保存地址變量。
p指向i-->p就是變量i的地址
int* p=&i;
int* p,q;? ? //q是整型,p是指針? ? ? ? ?無(wú)論*在哪邊都一樣,沒(méi)有 int* 這個(gè)類型
int *p,q;? ?//q是整型,p是指針
int *p,*q;? //p,q都是指針
2,指針做參數(shù)
#include <stdio.h>
void f(int* p); //調(diào)用傳來(lái)的指針參數(shù)
int main(){int i=0;f(&i); //把變量i的地址傳給函數(shù)return 0;
}void f(int* p){printf("%p",p);
}
3,*單目運(yùn)算符
用來(lái)訪問(wèn)指針?biāo)硎镜刂飞系淖兞?/strong>
p是i的地址
*p是變量i
(1)訪問(wèn)i,返回對(duì)應(yīng)值?
#include <stdio.h>
int main(){void f(int* p);int i=0;f(&i);return 0;
}void f(int* p){printf("%d\n",*p);
}輸出:0
(2)訪問(wèn)i,更改i值
#include <stdio.h>
int main(){void f(int* p);int i=0;f(&i);printf("i=%d",i);return 0;
}void f(int* p){*p=1000;
}輸出:i=1000
?函數(shù)獨(dú)立空間變量規(guī)則,無(wú)法限制指針。
*p=1000? ?------>? ? ?i=1000;? ?更改i的值
在此可以想到scanf()函數(shù),也是同樣的原理。
三、指針與數(shù)組的聯(lián)系
注:64位系統(tǒng)下,指針大小為8字節(jié)
32位系統(tǒng)下,指針大小為4字節(jié)
1.數(shù)組做函數(shù)的參數(shù),不能使用sizeof()函數(shù)
#include <stdio.h>void f(int a[]);
int main(){int num[]={1,2,3,4};f(num);printf("num %d\n",sizeof(num));return 0;
}void f(int a[]){printf("a %d\n",sizeof(a));
}輸出:
a 8
num 16
發(fā)現(xiàn)函數(shù)中,數(shù)組大小和指針一樣大
//a[0]字節(jié)大小之所以是4,是因?yàn)閍[0]是一個(gè)元素,是整型數(shù)。整型字節(jié)大小為4.
//因?yàn)閟izeof(a)字節(jié)大小為sizeof(int*)==8.所以sizeof(a)/sizeof(a[0])==2.?
#include <stdio.h>void f(int a[]);
int main(){int num[]={1,2,3,4};f(num);printf("num[0] = %d",num[0]);return 0;
}void f(int a[]){a[0]=1000;
}輸出:num[0] = 1000
?數(shù)組num[0]中的值改變了,由此我們可以得出
函數(shù)參數(shù)表中,數(shù)組其實(shí)是指針
sizeof(a)==sizeof(int*)
數(shù)組參數(shù)雖然是指針,但仍可以進(jìn)行數(shù)組運(yùn)算
2.數(shù)組變量特點(diǎn)
(1)特點(diǎn)
-
數(shù)組變量是特殊指針
-
數(shù)組變量本身表達(dá)內(nèi)存地址
#include <stdio.h>
int main(){int num[]={1,2,3,4};int* p=num;//無(wú)需使用&取內(nèi)存地址printf("p = %p\n",p); printf("num = %p",&num[0]);//數(shù)組元素單個(gè)單元是變量,需要使用&return 0;
}輸出:
p = 000000000062FE00
num = 000000000062FE00
a==&a
(2)[ ]操作數(shù)
可以對(duì)數(shù)組/指針使用
#include <stdio.h>
int main(){int number=0;int* p=&number; //p是number內(nèi)存地址printf("%d\n",*p);printf("%d",p[0]); //p[0]指的是實(shí)際值的第一個(gè)整數(shù)return 0;
}輸出:
0
0
(3)* 操作符
可以對(duì)數(shù)組/指針使用
數(shù)組變量是const指針,不能改變
int b[ ]--->int* const b;? 常量指針
所以b=a(X) 數(shù)組間不能整個(gè)賦值
int* p=a (正確)? ?//a是數(shù)組變量
總結(jié)
以上是生活随笔為你收集整理的C语言指针(就做个笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 将字符型的数字转化为整型
- 下一篇: 指针与const