C语言指针与数组

一、指针

1.未赋值之前的指针不可使用(获得地址),如下

错误:
 int *p;
 int j=12;
 *p=j;//错误,p地址确定,可能指向未知区域

正确:
 int *p=&i;
 int j=12;
 *p=j;

2.const 与 指针

1.const指针
 int i=0;
 int j=0;
 int *const q=&i;//q是常量,不可改变(只是地址罢了)
 *q=26;//改变值可以
 q=&j;//error

2.所指的是const
 const int *p=&i;//*p是常量,不可改变,等价于int const* p;(const指针只有这两种方式,判断方式看 
 const是否在*前后面)
 *p=12;//error,*不可改变值
 i=13;//这个可以改变(虽然使得*p改变)
 p=&j;

总结:
  1.const在*前,*p=**不可用
  2.const在*后,p=**不可用
  

3、const的作用

4.指针运算

1.增加
#include<stdio.h>
#include<stdlib.h>
int main(){ 
  int a=1;
  int b=0;
  int *p=&a;
  printf("p=%p\n",p);
  p++;
  printf("p+1=%p\n",p);//地址增加sizeof(类型),这里增加4,因为sizeof(int)=4
  exit(0);
}

2.相减
#include<stdio.h>
#include<stdlib.h>
int main(){ 
  int a[]={0,1,2,3,4,5,6};
  int *p1=&a[1];
 int  *p2=&a[5];
 //printf("*p=%d\n",*p);
 //printf("*(p+1)=%d\n",*(p+1));
 printf("p1-p2=%d",p1-p2);//-4
 printf("p2-p1=%d",p2-p1);//4,相当于  地址相减/sizeof(指针类型) ,也可以看成间距
 exit(0);
}

3.指针类型转换
void *p=&i;
void *q=(void *)p;

5.分配内存malloc

int *p=(int *)malloc(n*sizeof(int));

***

free(p);//必须配套使用

6.函数指针

作用1:设置值
#include<stdio.h>
#include<stdlib.h>
typedef struct{//可变长数组,链表
	int size;
	int *array;
}IntArray;
/**
*创建可变长数组
*/
IntArray creat_IntArray(int size){
	IntArray a;
	a.size=size;
	a.array=(int*)malloc(size*sizeof(int));
	return a;
}
/**
*设置数组值
*返回位置上的值
*/
int* IntArray_at(IntArray* a,int index){
	return &(a->array[index]);
}
/**
*释放内存
*/
void IntArray_free(IntArray *a){
	free(a->array);
	a->array=NULL;
	a->size=0;
}
int main(int argc,char const *argv[]){
	IntArray a=creat_IntArray(10);
	*IntArray_at(&a,0)=10;//设置0位置上的值为10
	printf("a[0]=%d\n",*IntArray_at(&a,0));//输出0位置上的值,结果为10
	printf("size=%d\n",a.size);//数组长度
	IntArray_free(&a);//释放内存
	printf("a.size=%d\n",a.size);
}

7.函数指针

1.当变量

#include<stdio.h>
void f0(int i) {
	printf("f0,%d\n", i);
}
void f1(int i) {
	printf("f1,%d\n", i);
}
void f2(int i) {
	printf("f2,%d\n", i);
}
void f3(int i) {
	printf("f3,%d\n", i);
}
void f4(int i) {
	printf("f4,%d\n", i);
}
int main() {
	void (*p[])(int) = { f0,f1,f2,f3,f4 };//将函数存放到指针中
	printf("length=%d\n", sizeof(p) / sizeof(p[0]));
	int i = 0,j=0;
	printf("请选择需要调用的函数和参数:");
	scanf_s("%d%d", &i,&j);
	(*p[i])(j);
	return 0;
}
/*
input:
   0 1   相当于*p[i]=fi;  (*p[i])()=fi();
   1 1
output:
   f0,1
   f1,1
*/

2.当参数,用于传递函数

#include<stdio.h>
int cal(int (*p)(int,int),int a,int b) {
	//printf("cal=%d\n",(*p)(a,b));
	(*p)(a, b);
}
int plus(int a, int b) {
	return a + b;
}
int minus(int a,int b) {
	return a - b;
}
int main() {
	printf("cal(plus,1,2)=%d\n",cal(plus,1,2));
	printf("cal(minus,1,2)=%d\n", cal(minus, 1, 2));
	return 0;
}
/*
output:
   cal(plus,1,2)=3
   cal(minus,1,2)=-1
*/

二、数组

1. 二维字符串数组

   1). char a[][10]={"hello","world"};//字符串长度不能超过10

   2).char *a[]={"hello","world","world123456789"};//上面的改进版,长度任意。

12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值