A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© l5681065 中级黑马   /  2015-11-24 18:14  /  868 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

************************************************************************************************************
数组名是一个常量 因此不能用自加自减运算符 ++ --;
********************************************************************************************************


一维指针数组
int *pa[3];//指针数组,数组名是pa,可以存放3个指针(必须是int型变量的指针)
int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};
  //pa[0]存储的是a的地址
  //pa数组的首地址,pa==&pa[0]
printf("*pa[0]=%d\n",*pa[0]);//访问a的值
printf("*pa[0]=%d\n",*(&a));//访问a的值
printf("**pa =%d",**pa);//使用数组名访问a的值,pa是数组的首地址,*pa代表一维指针数组首地址所对应存储的值也就是pa[0]的值即&a,**pa就等同于*(&a)

int a1[2][2]={1,2,3,4};
int *pa1[2]={a1[0],a1[1]};
printf("**pa1=%d\n",**pa1);//用一维指针数组的首地址,访问a1[0][0]的值
printf("**(pa1+1)=%d\n",**(pa1+1));//用一维指针数组的首地址,访问a1[0][1]的值
********************************************************************************************************

指针变量之间运算
常见的用法:
两个指针都指向同一数组
i,判断两个指针变量指向的元素是否连续
ii,判断两个指针变量之间相隔几个元素;
注意:两个指针变量之间只有减法运算 如果两个指针变量指向同一个元素, 那么他们相减的结果是0 如果两个指针变量指向的元素相邻,他们相减的结果是1的 绝对值

两个指针变量之间的关系运算
//p1>p
//1 表示p1在高位
//0 表示p在高位或者指向同一个位置
********************************************************************************************************
用数组名访问二维数组
  int a[3][4]={{1,3,5,7}, {9,11,13,15}, {17,19,21,23}};
  //列指针
  //a[0]==&a[0][0] a[0]+1==&a[0][1] a[0]+2==&a[0][2]
  printf("&a[0][1]=%p\n",&a[0][1]);
printf("a[0]+1 =%p\n",a[0]+1);
  printf("a[0][1] =%d\n",a[0][1]);
  printf("*(a[0]+1)=%d\n",*(a[0]+1));
  printf("&a[0][2]=%p\n",&a[0][2]);
  printf("a[0]+2 =%p\n",a[0]+2);
  /a+j == &a[j]
  //行指针
  //a+1 第二行的首地址
  //a+2 第三行的首地址
printf("a[1]=%p\n",a[1]);
  printf("a+1 =%p\n",a+1);
printf("a[2]=%p\n",a[2]);
printf("a+2 =%p\n",a+2);
  //a+1 第二行第一个元素的地址
  //*(a+1)==&a[1][0]
printf("*(a+1) =%p\n",*(a+1));
printf("&a[1][0]=%p\n",&a[1][0]);
printf("&a[1]=%p\n",&a[1]);
  //*(a+j) 获取数组a[j]的值
  //a == *(a+i)  符合一维数组的用法 因此二维数组也是特殊的一维数组
//*(*(a+i)+j) == a[j]
int i=0,j=0;
for(i=0;i<3;i++) { for(j=0;j<4;j++)
{
printf("*(*(a+%d)+%d)==a[%d][%d]==%d\t",i,j,i,j,*(*(a+i)+j)); } printf("\n");
}
********************************************************************************************************
普通指针访问二维数组
int a[3][4]={{1,3,5,7},
{9,11,13,15},
{17,19,21,23}};
int *p=a;
int i;
for(i=0;i<12;i++)
{
printf("%d\t",*(p+i));
}  

********************************************************************************************************

int a[3][4];
int (*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;//将该二维数组的首地址给p,也就是a[0]或&a[0][0]
p++;//该语句执行过后,也就是p=p+i;;跨过a[0][]指向了行a[1][]
数组指针:
定义一个指针变量,让这个指针指向一维数组的元素
二维数组指针
行指针,用来指向二维数组的每一行,存放的是行的首地址
定义格式:数据类型(*行指针变量名)[ 数组第二维的长度];
二维数组指针的初始化
int a[2][3];
int b[2][3];
float f1[4][4];
//假设我要定义一个指向数组a的一个行指针
//a == &a[0] ==&a[0][0] == a[0]
int (*p)[3]=a;

二维数组指针的使用
*(*(p+i)+j)  



  

int a[3][4]={{1,3,5,7},{9,11,13,15},
{17,19,21,23}};

int i,j;

for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d\t",*(*(a+i)+j));;
}
}
//二维数组指针
//二维数组指针可以替代数组名去使用
int (*p)[4]=a;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d\t",*(*(p+i)+j));;
}
}
********************************************************************************************************
指针数组与二维指针数组的区别
int *pa[3]={&a,&b,&c};//pa是一个指针数组
int *pa1[2]={a[0],a[1]};
int (*pa)[3];//二维指针数组
二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"两边的括号不可少
而指针数组类型表示的是多个指针(一组有序指针)在一般形式中"*指针数组名"两边不能有括号

********************************************************************************************************

字符串指针介绍及使用
字符串指针:
字符串指针指向字符串
char *变量名="字符串内容";//“字符串内容是常量”
char *str="abc";
char ch='b';
char *p1=&ch;

注意: 字符数组是保存在栈里的
字符指针保存的是制定出常量地址,常量区是只读的 不可修改



//str只保存了字符串常量的首地址
char *str="woaibiancheng";
//指针变量只占八个字节
str="i love you";//str这个指针改变了指向
printf("strlen=%ld\n",strlen(str));
printf("%s\n",str);
char ch[]="abc";
ch[2]='z';
printf("%s\n",ch);
//读取字符串常量的某一个字符
printf("%c\n",*(str+2));
//*(str+2)='X';错误的,因为字符串常量保存在常量区  
char *str2=NULL;
str2=malloc(100);//这句话的作用申请了100个字节的内存 str2  头文件stdilb.h
scanf("%s",str2);
printf("%s\n",str2);
char ch3[100];
char *str3=ch3;//str指向ch3
scanf("%s",str3);
printf("%s\n",str3);

********************************************************************************************************

二维字符指针数组概念
char *name[3]={"abcasdadadafaf","def","kkk"};
//char 类型的指针数组
int i; for(i=0;i<3;i++)
{
printf("%s\n",name); printf("%s\n",*(name+i));
}
//字符串指针和字符数组的区别
//字符串指针:
char *ss ="abc";
//指向可以改变
ss="hello world";
//字符数组:
char s1[]="abc";
  //s1="hello world";数组名是个常量,不能被赋值
********************************************************************************************************




1 个回复

倒序浏览
第一种:局部结构体
#include<stdio.h>
int main(){
    //一种正常的局部结构体
  
struct person{
    char *name;
    int age;
};
//赋值与取值
    struct person per={"angelaBaby",23};
    printf("name=%s---age=%d\n",per.name,per.age);
    return 0;
}
第二种:全局结构体
#include<stdio.h>
struct person{    //一种全局结构体
    char *name;
    int age;
}per={"angelaBaby",23};
int main(){
//赋值与取值
    printf("name=%s---age=%d\n",per.name,per.age);
    return 0;
}
第三种:匿名类型结构体
//匿名类型结构体
#include<stdio.h>
int main(){
    struct {
        char *name;
        int age;
    }per={"angelaBaby",23};
   
    printf("name=%s---age=%d\n",per.name,per.age)
   
}
第四种:嵌套类型结构体
//嵌套类型结构体
#include<stdio.h>
int main(){
    struct person{
        char *name;
        int age;
    }p1;
    struct actor{
        char *name;
        int age;
        struct person p1;
    }a1={"huangXiaoMing",30,
        {"angelaBaby",23}};
    printf("演员名字是= %s,年龄是 %d,人名字是= %s,年龄是 %d\n",a1.name,a1.age,a1.p1.name,a1.p1.age);//需注意的地方!!!
    return 0;
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马