#include<stdio.h>
int main(void)
{
int * p;
int i = 5;
*p=i;
printf(*p);
return 0;
int main(void)
{
int * p;
int i = 5;
*p=i;
printf(*p);
return 0;
}
在变量声明时
在内存中已经开辟了一段内存空间,*p 里就已经有了一个不知道的值;
*p 以p为地址的一段变量
&i;表示取变量i的地址
*p表示 p地址的变量
#include
<stdio.h>
int main( int argc, const char * argv[]) {
int i = 5 ;
int * p;
int * q;
p=&i;
p=q;
printf (*q);
return 0 ;
int main( int argc, const char * argv[]) {
int i = 5 ;
int * p;
int * q;
p=&i;
p=q;
printf (*q);
return 0 ;
}
q本身是垃圾值,若把q付给p;那么p也会变成垃圾值
*q所代表的内存单元的控制权并没有分配给本程序。
可能会导致内存泄漏出现野指针。
p q r 指向同一个内存空间,free(p),再使用free(q),可能会导致程序崩溃。
形式参数的改变不能改变实际参数。
1.实参必须改为普通变量的地址
2.形参必须为指针变量。
3.在被调函数中通过
*p 来
修改主调函数相关变量的值
#include
<stdio.h>
int main( int argc, const char * argv[]) {
int a= 3 ;
int b= 5 ;
huhuan(&a,&b);
return 0 ;
}
void huhuan( int * p, int * q)
{
int * t;
t=*p;
*p=*q;
*q=t;
int main( int argc, const char * argv[]) {
int a= 3 ;
int b= 5 ;
huhuan(&a,&b);
return 0 ;
}
void huhuan( int * p, int * q)
{
int * t;
t=*p;
*p=*q;
*q=t;
}
*号的含义,
1.乘法
2.定义指针变量
3.取地址的逆运算符号(指针运算符)
&表示变量的地址(*p表示 以p的内容为地址的变量)
单个字符要用单引号扩起来char
指针可以使函数返回一个以上的值;
2.指针和数组:
指针和一维数组
一维数组名是个指针变量
他存放的是一位数组的第一个元素的地址
如果一个函数需要处理一个数组, 需要第一个元素的地址和数组的长度
指针变量不能相加,不能相乘,不能相除,
如果两个指针变量指向的是同一块连续空间中不同存储单元,则这两个指针变量才可以相减。
一个指针变量到底占几个字节:一个指针变量占4个字节
若指向char1个
若指向int2个
若指向double4个
sizeof(int)
指针因为本身已经声明了类型,所以知道自己到底是几个长度的地址
数组:长度不能是变量。而且必须是常整数
传统定义的数组,程序员无法手动释放,数组一旦定义,系统就会为该数组分配存储空间就会一直存在,除非数组所在的函数运行结束。
数组的长度一旦定义,就不能改变。
A函数定义的数组,在A运行期间可以操作该数组,一旦A运行完毕,就不行了。
动态内存:
Malloc是memory() allocate(分配)的缩写
分配内存
1.要使用Malloc,必须添加malloc.h 头文件
2.malloc函数只有一个形参,并且形参事整形。
3.形参表示请求系统为本程序分配多少个字节
4.malloc函数只能返回第一个自己的地址。
#include
<stdio.h>
#include <malloc.h>
int main( void ) {
#include <malloc.h>
int main( void ) {
int
i=
5
;
int
* p=(
int
*)
malloc
(
4
);
*p = 5;
free(p);
return 0 ;
return 0 ;
}
分配了8个字节,p变量占4个字节,p所指向的内存也站4个字节。
6.p本上所占的内存是静态的,p所指向的内存是动态的
#include <stdio.h>
#include <malloc.h>
int main(void){
int a[5];
int len;
int * pArr;
int i;
scanf("%d",&len);
pArr = (int *)malloc(4*len);
for(i=0;i<len;i++){
scanf("%d",&pArr[i]);
}
printf("输出\n");
for(i=0;i<len;i++){
printf("%d\n",pArr[i]);
}
return 0;
}
多级指针:
#include
<stdio.h>
int main( void ) {
int i= 5 ;
int * p=&i;
int ** q=&p;
int *** g=&q; //q 是个指针变量,无论 q 是什么类型的指针,都只占 4 个字节
printf ( "%d\n" ,***g);
return 0 ;
int main( void ) {
int i= 5 ;
int * p=&i;
int ** q=&p;
int *** g=&q; //q 是个指针变量,无论 q 是什么类型的指针,都只占 4 个字节
printf ( "%d\n" ,***g);
return 0 ;
}
#include
<stdio.h>
#include <malloc.h>
void f( int ** q)
{
*q = ( int *)malloc( sizeof ( int ))
**q = 6 ;
}
int main( void )
{
int * p;
f(&p);
printf( "%d\n" ,*p);
#include <malloc.h>
void f( int ** q)
{
*q = ( int *)malloc( sizeof ( int ))
**q = 6 ;
}
int main( void )
{
int * p;
f(&p);
printf( "%d\n" ,*p);
}
指针优点:
表示一些复杂的数据结构
快速地传输数据,减少了内存的使用
是函数返回一个以上的值
能直接访问硬件
能够方便地处理字符串
是理解面向对象语言中引用的基础