您的位置:首页 > 编程语言 > C语言/C++

C语言指针

2015-06-29 15:23 239 查看
指针就是内存地址,一个变量所在的内存地址就是该变量的指针。

&:取变量内存地址,即取指针。

*:取内存地址对应的变量,即取指针所指的变量。

定义指针变量:类型* 指针变量名;

例如:

int* a 定义指向int类型的指针变量,只能存放int类型变量的地址

float* b 定义指向float类型的指针变量,只能存放float类型变量的地址

//指针基础
void zhizhentest1(){
//定义int类型的a变量,值为5
int a = 5;
//定义指向int类型的指针变量p
int* p;
//将a 的地址赋给指针变量p
p = &a;
//*p 输出p所指的变量的值
printf("%d\n", *p);
printf("%d\n", a == *(&a));
}


指针变量作为函数参数:

交换a、b的值

#include <stdio.h>

void swap_(int*,int*);

//指针变量作为函数参数
void zhizhentest2(){
int a=5;
int b=9;
int* pa = &a;
int* pb = &b;
swap_(pa, pb);
printf("pa=%p, pb=%p\n", pa,pb);
printf("a=%d, b=%d\n", a,b);
}

void swap_(int* p1, int* p2){
//将p1所指变量(a)的值赋给tmp,相当于 int tmp = a;
int tmp = *p1;
//将p2所指变量(b)的值赋给p1所指变量(a),相当于 a = b;
*p1 = *p2;
//将tmp变量的值赋给p2所指变量(b),相当与 b = tmp;
*p2 = tmp;
}
输出:

pa=0012FF28, pb=0012FF24

a=9, b=5

数组作为函数参数:

//定义形参arr,arr也是一个指针变量,接收调用函数时传入的指针
void arraytest2_2_1(int arr[]){
//由于arr接收的只是指针,并不是真实数组,所以sizeof其实是对指针进行取占用字节操作,
//32位系统返回4,64位返回8
int len = sizeof(arr)/sizeof(arr[0]);
printf("len=%d\n", len);
for(int i=0; i<len; i++){
printf("arr[%d]=%d\n", i, arr[i]);
}
printf("\n\n");
}


int arr[] = {10,20,-25,4,6};
//传入函数的不是数组本身,而是数组的首地址(第一个元素的地址),即传入的是指针
arraytest2_2_1(arr);


输出:

len=1

arr[0]=10

数组变量arr存放的只是数组的指针(数组首地址),调用arraytest2_2_1传入的只是arr的副本,也是一个指针。

所以arraytest2_2_1形参arr接收的只是一个指针(内存地址)而已,而不是真实的数组名。

然后通过sizeof(arr),其实是对指针进行操作,在32位系统上指针占4字节,64位系统上占8字节,这里是xp系统,所以这里返回的4

而sizeof(arr[0]),其实是对数组的第一个元素类型取占用字节数,arr[0]是int类型,占4字节,所以sizeof(arr[0])返回4,最后len等于1

在定义数组时就计算出数组的长度:

int arr[] = {10,20,-25,4,6};
int len = sizeof(arr)/sizeof(arr[0]);
arraytest2_2_2(arr, len);
//定义函数。参数:int型数组arr用于接收传入的数组指针,len接收传入的数组长度
void arraytest2_2_2(int arr[], int len){
for(int i=0; i<len;i++){
printf("arr[%d]=%d\n", i,arr[i]);
}
printf("\n\n");
}
输出:

arr[0]=10

arr[1]=20

arr[2]=-25

arr[3]=4

arr[4]=6

这里定义int arr[]数组来接受传递过来的指针是可以的,因为arr存放的只是一个指向空数组的指针

通过指针变量来接受传入函数的数组是可以的:

//参数:指向int型的指针变量,len数组长度
void arraytest2_2_3(int* a, int len){
//a保存的是指向数组首地址的指针,a就相当于数组变量,可通过下标访问数组元素
for(int i=0; i< len; i++){
printf("a[%d]=%d\n", i, a[i]);
}
printf("\n\n");
}
输出:

a[0]=10

a[1]=20

a[2]=-25

a[3]=4

a[4]=6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: