一.指针的定义
c语言中指针用变量前加‘*’号来表示,指针只是内存地址,并没有什么特殊之处。
定义:如 int *pv; 定义了一个整形指针变量,用来存储整数的内存地址。
赋值:int num;pv=# 将变量num的内存地址赋值给pv.
访问变量的值:两种方法,第一种直接使用变量名num来使用num中的值这叫直接访问;第二种使用
指针*pv来获取num中的值这叫间接访问。(此处pv表示的num的地址值,而*pv表示的num的数值)
补充:
- 按值传递
- 按引用传递
二.数组与指针:(指针的递增和递减都是以内存块为单位)
1.为什么数组可以用指针来处理
首先我们必须清楚,数组名代表数组首元素的起始地址。这是数组本身的特性,于是我们可将数组名当成指针来处理。
int array[100]; int *pv;
pv=array;或者pv=&array[0]; 用指针pv来存储数组首地址。
2.使用指针来引用数组中的任意元素:
*array=*(array+0)=array[0];
*(array+1)=array[1];
那么任意的可以写成:*(array+i)
*pv表示数组中第一个值,使用*pv++来访问数组中下一个值。
3.二维数组与指针(和一维数组类似)
array[0][0]=*(*(array+0)+0);
array[0][1]=*(*(array+0)+1);
array[1][0]=*(*(array+1)+0);
可以看出 :array[i][j]=*(*(array+i)+j);
pv=array;
*pv表示数组中第一个值,使用*pv++来访问数组中下一个值。由此可以看出二维数组是特殊的一维数组。
三.指针数组
1.存在的意义(要解决什么问题)
为多个字符、字符串和数组分配动态内存。
补充:有关动态内存问题请看“动态内存和静态内存浅析”
比如:现在要为20个字符串分配动态内存,每个内存容纳20字节。
char *name[20];
name[i]=(char *)malloc(20);//添加头文件 #include<stdlib.h>
四.函数的指针传参
在之前我们向函数传递的参数要么是字符、要么是数值,还没有传递字符串的操作。那么现在函数的指针传参可以解决
传递的参数是字符串的问题。只需要将参数定义为字符指针类型即可:
void function(char *str)
五.指针返回值
我们见过函数返回一个数值和字符,那么要函数返回一个数组一个字符串该如何做呢?答案是:用指针返回
定义函数为 :int * function();或者 char *funtion(char *str);
在此给一个函数返回值为字符串,传递的参数也为字符串的实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * function(char *name){
char *s= "hello" ;
strcat(s,name);//两字符串连接
return s;
}
int main(){
char * n;
n=(char *)malloc(sizeof(int));//在堆空间中申请内存空间
printf("请输入一个字符串") ;
gets(n);
printf("%s\n",function(n));
puts(function(n));
return 0;
}