#include <stdio.h>
void interchange2(int , int);
void interchange1(int * u, int * v);
int main(void)
{
int x = 5, y = 89;
printf(" x = %d, y = %d \n", x, y);
interchange2(x,y);
printf(" x2 = %d, y2 = %d \n", x, y);
interchange1(&x, &y);
printf(" x1 = %d, y1 =%d \n", x, y);
return 0;
}
void interchange1(int * u, int * v)
{
int temp;
temp = *u;
*u = *v;
*v = temp;
return 0;
}
void interchange2(int u, int v)
{
int temp;
temp = u;
u = v;
v = temp;
return 0;
}
函数1只是在形参交换数据,数据2可以对主函数中的实参值进行交换
数组的指针表示
/** sum.c 求数组中元素之和 */
#include <stdio.h>
#define SIZE 10
int sum(int * start, int * end);
int main(void)
{
int marbles[SIZE] = { 12, 32, 2, 35, 89, 2, 34, 90, 13, 30};
long answer;
answer = sum(marbles, marbles + SIZE);//数组表示,开始和结束
printf("****** %ld ********", answer);
return 0;
}
int sum(int * start, int * end)
{
long total = 0;
while(start < end){
total += *start;
start++;
}
return total;
}
1)sum(int marbles[], int)//第一个[]是地址,第二个元素个数
2)sum(int * start, int * end) //第一个是start数组首地址元素,第二个是结束地址
不要解引用未初始化的指针
int * pt; // 未初始化的指针
*pt = 5; // 严重错误
系统创建一个指针时候只分配了储存指针本身的内存,未分配储存数据内存
指针常量与常量指针
指针常量就是指针不可变,而指向内容却可以改变(必须初始化)int * const p;
常量指针就是指针可变,但指向常量不可改变(不必初始化)int const * p, const int * p;
int (*ptr)[3]
int (* ptr) [3]:表示ptr是一个指向数组的指针,数组的每个元素含有3个数组元素,也就是3代表数组的列
int(*ptr) [N],N代表的是数组的列。编译器要知道指针指向的数组元素包含多少元素,也就是N
传递函数形参
void sum(int (*pt)[N]);
等价于:
void sum(int pt[][N]); []代表pt是一个指针
void sum(int pt[3][N]);有效,但3将被忽略
int ref[] = {1, 2, 3, 21};
int * pt;
ref + 1// 合法
ref++// 不合法,因为ref值是常量