C语言指针
2015-06-29 15:23
239 查看
指针就是内存地址,一个变量所在的内存地址就是该变量的指针。
&:取变量内存地址,即取指针。
*:取内存地址对应的变量,即取指针所指的变量。
定义指针变量:类型* 指针变量名;
例如:
int* a 定义指向int类型的指针变量,只能存放int类型变量的地址
float* b 定义指向float类型的指针变量,只能存放float类型变量的地址
指针变量作为函数参数:
交换a、b的值
pa=0012FF28, pb=0012FF24
a=9, b=5
数组作为函数参数:
输出:
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
在定义数组时就计算出数组的长度:
arr[0]=10
arr[1]=20
arr[2]=-25
arr[3]=4
arr[4]=6
这里定义int arr[]数组来接受传递过来的指针是可以的,因为arr存放的只是一个指向空数组的指针
通过指针变量来接受传入函数的数组是可以的:
a[0]=10
a[1]=20
a[2]=-25
a[3]=4
a[4]=6
&:取变量内存地址,即取指针。
*:取内存地址对应的变量,即取指针所指的变量。
定义指针变量:类型* 指针变量名;
例如:
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
相关文章推荐
- C++ const面试题和相关的解释
- 汉字字频统计程序(Python版+C语言版)
- C++静态数组和动态数组的区别
- C语言判断某个年份是否是闰年
- C++第六章 习题
- 《thinking in c++》Volume 1知识点总结(二)
- C语言逆序输出某个数字
- C++中传值参数和引用参数和指针怎样区别?
- 《thinking in c++》Volume 1知识点总结(一)
- C语言计算最大公约数
- C语言static
- 学习C++动态链接库基础知识 (主要关于QT项目)PART2
- boost::serialization学习笔记
- C++获取控制台输出
- C语言extern
- c/c++数组初始化误区
- C++关于二进制位操作小结
- LeetCode_Validate Binary Search Tree
- 黑马程序员-OC语言-函数和对象方法的区别(听课笔记)
- c++程序员经典面试题