1.指针需要占用内存空间,指针存储内存地址的值(指针大小为4字节32位);
使用时:*号取指针指向的内存地址中的值;
声明时:*号表示指针类型
*((int*)0X22FFCC)= 1;--->将0X22FFCC声明为int型指针,在对0X22FFCC地址赋值
2.传址调用
当函数内部想修改外部的值时,使用传址;(如:void func(void *a))
3.数组地址与数组名
1)数组名为数值首地址
2)数组地址使用&取地址,
3)首地址与数组地址相同
4.数组名
1)数组名可以看做常量指针
1.数组名只能作为右值
2.数组名指向数值首地址
2)下面情况不作为常量指针
1.数值名为sizeof()参数;
2.数组名使用&;
(char *)(* (unisgnde int*)p))
3)数组名不是指针
5.指针运算
1) p+n -->(unsigned int)p + n *sizeof(*p)
指针p指向同类型数组元素时:p+1指向当前元素下一个元素
P-1指向当前元素上一个元素
2)p0 - p1 -->((unsigned int)p0 - (unsigned int)p1)/sizeof(*p)
指针间只能用减法
只有两指针指向同一个数组时,相减的值为元素下标
6.a与&a
a + 1 (unsigned int)a + sizeof(*a)
&a + 1 (unsigned int)(&a) + sizeof(a)
7.字符串可以在栈空间,堆空间,只读存储区(不可修改字符串)
char s1[] = {‘H’,‘e’,‘l’,‘l’,‘o’}; --->栈空间(字符数组)
char s1[] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’}; --->栈空间(字符串)
char* s2 = “Hello”;--->只读存储区(不可修改)
char* s3 = (char*)malloc(6*sizeof(char)); --->堆空间
s3[0] = ‘H’; s3[1] = ‘e’; s3[2] = ‘l’;
s3[3] = ‘l’; s3[4] = ’o’ ; s3[5] = ‘\0’;
8.size_t strlen();
size_t 是无符号数;相减不可能产生负数(if( strlen(a)-strlen(b) > =0 )警告)
9.strcmp()
1)以0值表示 相等
2)第一个字符大于第二个字符 返回值 :大于0
3)第一个字符小于第二个字符 返回值 :小于0
10.strcpy和strcat必须保证目标字符数组剩余空间足以保存整个源字符串
1)strncpy(a,b,n) 将b复制n个字符到a中,剩下的空间以’\0’填充
2)strcat(a,b,n) 将b复制n个字符添加到a后面,总是在最后添加’\0’,不填充
11.数组名
一维数组:int a[5] --> a的类型为 int*;
二维数组:int a[5][5] --> a的类型为 int (*)[5];
a为首元素的地址为a[0],a[0][0]
12.用指针形式遍历二维数组
int a[3][4]
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) printf(“%d\n”,*(*(a + i) + j ));
}
13.
一维数组参数:必须提供长度信息;
二维数组参数:不能直接传递给函数。
14.函数类型
typedef type name(parameter list);
( int add(int i,int j) --> typedef int f(int,int) )
15.函数指针
1)函数名就是函数的入口地址;
2)定义:type (*point)(parameter list)
Type:返回类型
Point:函数名
Paramseter:传参
typedef void (FUNC)(int);
void test(int a)
{
printf(“hello\n”);
}
int main()
{
FUNC* p = test;
p(2);
}
16.回调函数
typedef void (* FUNC)(int);
void test(int a)
{
printf(“hello\n”);
}
void g(int a,FUNC f)
{
f(a);
}
int main()
{
g(2,test);
}
17.右左法则
int(*(*p4)[5])(int*); int (* (*p4) [5] ) (int*);
1.(*p4) 然后向右得到[5]
2.[5] 然后向左得到{*}
3.(*)
4.int(int*)