1.指针的概念
指针是什么?指针是变量,里面存放的是地址,如果定义了一个指针变量,而不赋给地址,会出现“段错误”
2.指针的常见用法
一个整型数 :int a;
指向一个整型数的指针: int *a;
一个指向指针的指针,这个指针指向的是整型数: int **a;
一个有10个整型数的数组:int a[10];
一个有10个指针的数组,该指针指向一个整型数 : int*a[10]
一个指向函数的指针, 该函数有一个整型参数,并返回一个整型数 : int (*p)(int a)
一个有10个指针的数组, 该指针指向一个函数,该函数有一个整型参数,并返回一个整型数 , int (*a[10])(int a)
3.
int b;
int *a=&b; 表示 定义一个指向整型变量的指针a,同时把b的地址给a;
相当于:
int b;
int *a;
a=&b;
4.指针和数组
int a[5];
int *ptr;
ptr = a;----数组a的首地址给ptr;
也可以写成:
ptr=&a[0];-----第一个元素的地址给ptr;
#include <stdio.h>
int main()
{
int a[10]={0,1,2,3,4,5};
int *ptr;
ptr = a;
printf("a = %d\n",ptr[3]); -----a[3], *(ptr+3)都是可以的;
return 0;
}
~
~
5.指针和字符串
char *ptr;
ptr="hello world";
或者:
char *ptr = "hello world";
后面碰到:char * ----,就要想到字符串;“”
#include <stdio.h>
int main()
{
char *str="hello world!";
printf("str=%s\n",*str);
return 0;
}
~
错误:会出现段错误,因为%s是字符串,不是字符,而*str表示h;
6. NULL和指针
在c中:#define NULL 0
但是判断指针变量为不为0的时候,用if(ptr != NULL); 不允许用0来做比较;
可以用char *ptr = NULL; 来初始化ptr,但是ptr还是不能使用;必须赋地址才行;
7.int a[10];
int *p=a;
p+i, a+i都表示a[i]的元素地址;
*(p+i), *(a+i)都是表示a[i];
**********************************************
p[i] 和*(p+i) 等价
**********************************************
a[5]----*(a+5), *(p+5),p[5] 等价的;
&a[5]---p+5, a+5,等价都是a[5]的地址;
下标法:a[i],p[i];
指针法 :*(a+i), *(p+i)
8.指针数组,数组指针
char *str = "hello world"-----表示的str中放置的是hello world的首地址;
如果几个字符串放在一个数组中,如:
char *str[4] = {"hello", "world", "yes","what"}; ----指针数组,表示:
str[0]中放置的是“hello" 的首地址;
str[1]中放置的是"world"的首地址;
str[2]中放置的是 “yes”的首地址;
str[3]中放置的是"what"的首地址;
数组指针:
int a[4][4]={{0,1,2,3},
{4,5,6,7},
{8,9,10,11},
{12,13,14,15}};
int (*p)[4]------数组指针;
p=a; -----p放置的是a的第0行首地址;
p------0,1,2,3
p+1-----4,5,6,7
p+2-----8,9,10,11
p+3-----12,13,14,15
9. int **p
int *p ----p放地址----〉3
int **p----*p----p-----3
#include <stdio.h>
int main()
{
int a[5]={1,3,5,7,9};
int *num[5];
int **p;
for(i=0; i<5; i++)
num[i]= &a[i];
p=num;
for(i=0; i<5; i++)
{
printf("%d ", **p);
p++;
}
printf("\n");
return 0;
}
10. 列指针变量
#include <stdio.h>
int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
a[0] --------------0行0列的地址
for(p=a[0]; p<a[0]+12; p++)
{
printf("%3d ", *p);
}
return 0;
}
11. 行指针变量
#include <stdio.h>
int main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
int i,j;
p=a;
for(j=0; j<4; j++)
printf("%3d", *(p+j));
return 0;
}